我在AS3工作,但我想这可能是一个普遍的问题,所以我会更模糊地构建它......
我正在使用XML文件来定义实现策略模式的特定对象类的参数。将有各种各样的对象,这对我们来说是一个设计友好的解决方案来定制这些对象。由于我只能在XML文件中定义字符串,有人可以提出一种整齐的方法来获取该字符串并实施正确的策略吗?
我有两个初步想法。首先,将字符串传递给对象的构造函数,然后在对象中包含一个应用正确策略的Switch Case。
其次,所以将开关置于控制器之外,然后将正确的策略传递给对象的构造函数。
第二个似乎是更干净的版本,因为对象类本身不受我的具体实现的影响。但感觉还不对。
任何其他建议将不胜感激!
答案 0 :(得分:3)
您需要某种工厂设计模式,以根据输入字符串选择适当的类。一个很好的应用程序是Registry,其中适用的类“注册”自己与单例注册表类适合某个输入字符串;然后工厂本身就成了从字符串到注册类的查找。当没有类注册了被请求的输入字符串时,需要出现一些回退:要么是异常,要么是在没有特定应用时使用的“默认”实现 - 后者是一个很好的fail-soft选项,但并不总是适用。
Registry的一个不可避免的问题是,如何定位所有感兴趣的类并确保它们自己注册(对于Plugin类来说尤其有趣);对此的最佳解决方案相当依赖于手头的特定语言,不幸的是我不确定AS3在这方面提供了什么(或者如果你对这种动态可扩展性感兴趣的话)。
Registry的另一个有趣问题是“冲突” - 如果多个适用的类声称对某个输入字符串是正确的,会发生什么。 “最后赢得胜利”是最简单的,但往往太简单;你可能让每个类注册多个具有某个“优先级”或“优先级”的输入字符串,否则(对于未分发但对分布式系统至关重要的系统并不感兴趣......)“负载均衡”适用的“服务器”(循环或更复杂的方式)。
你会注意到这些解决方案比你的第二个解决方案更像你的第二个,但关键的区别在于它不依赖于脆弱,刚性的硬编码开关(OOP bete noire ;-)而是依赖于灵活的映射来自字符串到类(或类构造方法,委托和& c,取决于实现语言的细节 - 例如在Java中你可能有一个StrategyConstructing接口,每个策略类然后会注册它自己的辅助类,当它签署时实现该策略直到注册处。)
答案 1 :(得分:0)
有关实现的详细信息,您可能需要查看this post,它处理类似的问题...我的答案包含一个示例实现,以便开始...
我认为,你应该做一个字符串< - >实例映射,因为它更健壮......从应用对象的角度来看,策略应该是无状态的,接收来自该对象的所有输入......这样你就可以在运行时切换策略,因为它不是显而易见的在任意执行点同步对象的状态和策略......
格尔茨
back2dos