1

我在 AS3 工作,但我想这可能是一个普遍的问题,所以我会更模糊地描述它......

我正在使用 XML 文件来定义实现策略模式的特定对象类的参数。将会有各种各样的对象,这对我们来说是一个设计者友好的解决方案来定制这些对象。由于我只能在 XML 文件中定义字符串,有人可以建议一种整洁的方法来获取该字符串并实施正确的策略吗?

我最初有两个想法。首先,将字符串传递给对象的构造函数,然后在对象中拥有一个应用正确策略的 Switch Case。

其次,将开关放在控制器中的类之外,然后将正确的策略传递给对象的构造函数。

第二个似乎是更干净的版本,因为对象类本身不受我的具体实现的影响。但两者都感觉不太对。

任何其他建议将不胜感激!

4

2 回答 2

3

您需要某种工厂设计模式,以根据输入字符串选择适当的类。Registry 是一个很好的应用程序,其中适用的类使用单例 Registry 类“注册”自己,使其适合某个输入字符串;然后工厂本身就变成了从字符串到注册类的查找。当没有类为所请求的输入字符串注册时,需要存在一些后备:要么这是一个例外,要么有一个“默认”实现在没有更具体的应用时使用——后者是一个很好的故障软选项,但并不总是适用。

Registry 的一个不可避免的问题是,如何定位所有感兴趣的类并确保它们自己注册(这对于 Plugin 类特别有趣);对此的最佳解决方案相当依赖于手头的特定语言,不幸的是,我不确定 AS3 在这方面提供了什么(或者您是否对这种动态可扩展性感兴趣)。

Registry 的另一个有趣问题是“冲突”——如果多个适用的类声称是某个输入字符串的正确类,会发生什么情况。“最后赢得胜利”是最简单的,但往往过于简单;您可以让每个类注册多个具有特定“优先级”或“优先级”的输入字符串,或者(在非分布式系统上不是很有趣,但对分布式系统至关重要......)所有之间的“负载平衡”适用的“服务器”(循环或更复杂的方式)。

您会注意到,这些解决方案比您的第一个解决方案更类似于您的第二个解决方案,但关键区别在于,它们依赖于从字符串到类的灵活映射,而不是脆弱、僵化的硬编码开关(OOP bete noire;-) (或类构造方法、委托等,具体取决于实现语言的细节——例如,在 Java 中,您可能有一个 StrategyConstructing 接口,然后每个策略类将在注册注册表时注册其自己的辅助类来实现该策略) .

于 2009-08-25T05:00:23.760 回答
0

是的,亚历克斯指出了正确的方法......

对于实现细节,你可能想看看这篇文章,它处理了一个类似的问题......我的答案包含一个开始使用的示例实现......

我认为,你应该做一个字符串 <-> 实例映射,因为这更健壮......从应用对象的角度来看,策略应该是无状态的,接收来自该对象的所有输入......这样你就可以在运行时切换策略,因为在任意执行点同步对象的状态和策略并不明显......

问候

back2dos

于 2009-08-25T10:08:44.137 回答