【问题标题】:Extend the strategy pattern: Add Context methods and subclasses扩展策略模式:添加上下文方法和子类
【发布时间】:2012-02-15 23:24:37
【问题描述】:

strategy pattern 定义了一系列算法,封装了每个 一,并使它们可以互换。策略让算法变化 独立于使用它的客户。

确实很好。但是考虑一下这种情况:我有一个策略模式,其中包含一些上下文子类和一些算法,如下所示。代码最后应该关闭进行修改,但我仍然需要能够实现以下扩展性。无需更改现有代码:

  1. Context 添加使用策略的新方法
  2. 添加Context 的新子类型

我想到了Visitor,这对实现 1) 很有好处。但是添加新的Context 子类型需要更改所有Visitors,所以这不起作用。

Decorator 呢?通过装饰Context,您可以添加新方法。但我真正需要的是添加具有具体实现的方法,这些实现可以像策略模式一样变化。

您觉得如何,如何实现?

最好的问候

丰富

编辑:

这是一个具体的例子。

我应该解释一下:我有一个应用程序,它带有一个显示不同类型的VisibleObjects 的模拟窗口和另一个用于控制这些对象的窗口。 VisibleObjects 的状态需要在模拟使用策略中体现出来。例如,如果我禁用 Polygon,它应该隐藏在模拟中,或者完全删除,具体取决于它的具体 DisablingBehavior

如果定义了一种新的VisibleObject,比如定义了Picture,我希望所有现有的DisablingBehaviorsPositioningBehaviors 都能够处理它。

如果有一个新操作,比如MirrorObject(),需要在VisibleObjects 上执行我希望能够定义不同的MirroringBehaviors 行为,例如AxisMirroringPointMirroring,并将它们分配给VisibleObjects.

【问题讨论】:

  • 请举个具体的例子。
  • @jhauffin,我在帖子中添加了一个具体示例。您需要更多详细信息吗?
  • 为什么您认为您当前的设计无法实现您的目标?在我看来,您可以放入 PictureObject,它是 VisibleObject 的子类,它应该能够毫无问题地传递给您的 DisablingBehaviorPositioningBehavior 子类。
  • 是的,添加新子类很容易,但我不知道如何添加新方法。

标签: oop design-patterns architecture strategy-pattern


【解决方案1】:

设计模式并未涵盖所有情况。你不应该盲目地遵循某种模式,或者试图让你的软件适应某种模式。以下是 Robert C. Martin 书中的引述:

通常,它们在展示时并未展示代码如何演变为使用 模式。这可能会让您认为模式很简单 您以完整的形式插入代码和设计中的东西。 这不是我的建议。相反,我更喜欢改进我的代码 在模式的方向上工作。我可能会找到模式,或者 我可能不会。

【讨论】:

    【解决方案2】:

    看起来您可能需要一个桥接模式:http://en.wikipedia.org/wiki/Bridge_pattern

    它不会“保护”您免于添加新方法。我很确定在这种情况下没有任何模式可以提供帮助。当您向接口和/或基类添加公共方法时,您正在修改(而不是扩展!)具有所有后果的基本合同。

    【讨论】:

    • 谢谢,我会调查一下并回复你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    相关资源
    最近更新 更多