我正在用 Java 编程,但这更像是一个设计问题,因此任何 OO 程序员都可能回答这个问题。我有一个关于策略设计模式的问题。以下是我发现有用的几种墨水:
我使用了两次策略模式,一组是四种策略,一组是三种策略。在每种情况下,我都通过维护一个衰减计数器来决定使用哪种策略。如果软件决定使用的策略成功,则计数器加 1。如果使用的策略不成功,则计数器减一。无论成功还是失败,所有计数器都会乘以 0.9 左右的数字,以随着时间的推移“衰减”计数器。软件将根据哪个策略的计数器最高来选择使用哪个策略。下面显示了我非常简单的 UML 示例:
.
并以链接形式(便于阅读): Example UML
上面的 UML 是我想使用的模型。如果你从上面的UML看不出来,我正在写一个剪刀石头布游戏,目的是打败我所有的 friend 。
现在,回到问题上来:
我无法决定如何实现“计数器系统”来决定使用哪种策略。我正在考虑某种可以存储所有计数器和历史字符串的“数据”类,但这对我来说似乎很笨重。在任何时候,我都在维护大约 2 个字符串和大约 8 个计数器(可能更多也可能更少)。这就是为什么我在考虑一个可以存储所有内容的“数据”类。我可以实例化要在 chooseStrategy() 和 chooseMetaStrategy() 方法中使用的类,但我就是不知道。这是我将独自完成的第一个项目,我无法决定任何事情。我觉得肯定有更好的解决方案,但我没有足够的经验知道。
谢谢!
------------------------------------后续1-------- --------------------------------------
非常感谢大家的回答和美言。不过,我确实有一些后续问题。我是 StackOverflow 的新手(并且很喜欢它),所以如果这不是后续问题的正确位置,请告诉我。我正在编辑我原来的帖子,因为我的跟进有点冗长。
我正在研究 Paul Sonier 关于使用复合模式的建议,它看起来非常有趣(感谢 Paul!)。为了 HistoryMatching 和“智能”AntiRotation 策略的目的,我想实现两个类都可以访问的所有对手游戏的字符串。另外,无论我的程序使用什么策略,我都希望编辑历史字符串,以便我可以准确记录对手的游戏。字符串越全面(实际上我可能会使用 LinkedList,但如果有人知道更好的(子字符串/子列表)搜索方法/集合请告诉我)策略越能预测对手的行为。
我想知道如何在仍然使用复合模式的同时实现这个“字符串”或集合。
此外,TheCapn 提出为每个对手存储不同的计数器和历史集合是个好主意。关于如何使用复合模式实现这一点有什么想法吗?
最佳答案
理想情况下,目的是让计数器与策略相关联,因为它们计算策略的成功率。但是,您不一定希望策略知道它们被计算在内的事实。对我来说,这表示一个复合模式,您可以将 Strategy 类包装在一个类中,该类具有用于跟踪/降级/修改使用次数的逻辑。
这为您提供了局部性(计数与其计数的策略一起存储)和功能组合(计数功能封装在组合类中)。同样,它保持策略类与其他影响的隔离。
到目前为止,您的设计分解看起来不错;您肯定走在一条不错且有趣的道路上。希望这对您有所帮助!
关于java - 策略设计模式——在带有计数器的策略之间进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6614238/
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www