设计模式:Strategy
1.摘要
Strategy模式定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
2. 针对问题
当对象要调用某类算法时(例如排序),同一个算法可能有多种实现方式,客户程序中如果直接包含算法代码会让程序变得庞大并难以维护,这时如果要更改算法实现可能需要重写整个客户程序。Strategy模式将算法封装到独立的类型中,从而避免这些问题。
3. 介绍
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
4. 实现
Strategy模式的静态图如下:
其中:
Strategy类型声明算法接口,并在ConcreteStrategy类型中实现具体算法,必要时可以在算法中回调Context。
Context对象中维护strategy对象的引用,并将算法调用转发给Strategy。
在Context调用Strategy接口时可以传递算法必要的参数,或者直接传递Context本身,前者将使得Strategy和Context进一步解耦。
实现Context时可以使Strategy对象成为可选的,如果Context中有Strategy对象,则执行算法,否则继续执行。
实现Strategy对象时可以考虑使用Flyweight模式降低内存空间占用。
5. 特点
1、Strategy为同一算法声明提供了可重用的算法实现,并且可以实现算法实现的动态切换。
2、Strategy模式可以消除一些判断语句,如:
1 2 3 4 5 6 7 8 9 10 11 12 |
public doSometing() { if(condition) doOneThing(); else doAnotherThing(); } 可以变为: public doSomething() { strategy.do(); } |
3、客户在选择Strategy时必须了解不同Strategy实现的区别。
4、本模式增加了Strategy和Context之间通信的开销。
6. 相关文章
1、设计模式总结
7. 参考文章
- 《设计模式_可复用面向对象软件的基础》,
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可,转载请注明作者及原网址。
抱歉,暂停评论。