第二讲 策略模式
动机:
在软件的构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变的异常复杂,而且有时候支持不使用的算法也是一种负担。
如果在运行时根据需要透明的更改对象的算法?将算法与对象本身解耦从而避免上述问题?
代码示例
解决多算法问题的一般代码这里SalesOrder对象就和具体的计税算法绑定到了一起,通常见到else if语句出现,就意味着需要重构。如果现在希望添加有一种新的国家税法,就要修改TaxBase遗以及SalesOrder。这就和“开闭原则”想违背了,该原则要求对拓展开放、对更改封闭。类模块应该用拓展的方式应对今后的变化。如何在SalesOrder中消除掉else if,将其与具体的计税算法解耦合?
将不同国家的税法算法抽象成类SalesOrder类的写法也要相应的发生变化:
SalesOrder的新写法通过封装、多态技术,将不同算法抽象成TaxStrategy的派生类,并实现计算相应税法的虚函数,以此来将SalesOrder与具体的税法算法解耦合。
模式定义
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可以独立于使用它的客户程序而变化。———《设计模式》
结构
策略模式的结构其中Context和Strategy可以在Strategy的子类发生变的时候保持稳定、实现可复用
要点总结
Strategy及其子类为组件提供了一系列可重用的算法,从而使得类型在运行时方便的根据需要在各个算法之间进行切换。
策略模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。
网友评论