design-patterns - 什么时候以及为什么要使用策略模式?

标签 design-patterns strategy-pattern

何时使用Strategy Pattern

我看到这样的客户端代码片段:
class StrategyExample { public static void main(String[] args) { Context context; // Three contexts following different strategies context = new Context(new ConcreteStrategyAdd()); int resultA = context.executeStrategy(3,4); context = new Context(new ConcreteStrategySubtract()); int resultB = context.executeStrategy(3,4); context = new Context(new ConcreteStrategyMultiply()); int resultC = context.executeStrategy(3,4); } }
看起来您可以将其重构为:
class StrategyExample { public static void main(String[] args) { // Three contexts following different strategies int resultA =new ConcreteStrategyAdd().execute(3,4); int resultB =new ConcreteStrategySubtract().execute(3,4); int resultC =new ConcreteStrategyMultiply().execute(3,4); } }
代码的第一部分直接取自Wikipedia页面。一个很大的区别是上下文消失了,但是在示例中它什么也没做。也许有人有一个更好的例子,说明战略有意义。我通常喜欢设计模式,但是这种模式似乎增加了复杂性,却没有增加有用性。

最佳答案

诸如此类的玩具示例的问题在于,通常很容易忽略这一点。在这种情况下,确实可以按照您所显示的那样实现代码。在策略模式中,主要值(value)在于能够针对不同情况切换出不同的实现方式。

您拥有的示例仅说明了模式中的对象以及它们之间的相互作用。想象一下,假设您有一个组件可以根据另一端是台式机还是智能手机为网站绘制图形,那么您将拥有一些代码,该代码可以检测所创建浏览器的类型并在另一个可以设置策略的组件上进行设置。在一些不需要重复的复杂代码中使用策略对象,并且在两种情况下都可以完成工作,而将图形的实际绘制细节留给适当的策略对象:

interface GraphStrategy {
    Image renderGraph(Data graphData);
}

class BigGraphStrategy implements GraphStrategy {
    ...
}

class SmallGraphStrategy implements GraphStrategy {
    ...
}

然后在其他代码中:
GraphStrategy graphStrategy;

if (phoneBrowser == true) { 
    graphStrategy = new SmallGraphStrategy();
} else {
    graphStrategy = new BigGraphStrategy();
}

然后,您的其余应用程序代码可以只使用graphStrategy.renderGraph(),而无需知道是执行完整图像还是小图像渲染。

关于design-patterns - 什么时候以及为什么要使用策略模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1710809/

相关文章:

java - 你最好的 Swing 设计模式和技巧是什么?

java - 在运行时从类中调用方法

针对不同返回类型的 C# 策略设计模式

c++ - 如何选择正确的架构/设计模式

复杂数据结构的Qt Model/View编程

java - EJB 和 JPA 设计问题

ios - Objective C 上的类别 + 惰性实例化模式

design-patterns - 策略模式和适配器的区别

java - Mixins 与 Strategies Java

c# - 如何在 Ninject 中使用策略模式