何时使用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/