美文网首页
GeekBand C++ 李建忠老师 设计模式

GeekBand C++ 李建忠老师 设计模式

作者: 带三本书 | 来源:发表于2015-09-05 17:15 被阅读661次

    第二讲 策略模式

    动机:

    在软件的构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变的异常复杂,而且有时候支持不使用的算法也是一种负担。

    如果在运行时根据需要透明的更改对象的算法?将算法与对象本身解耦从而避免上述问题?

    代码示例

    解决多算法问题的一般代码

    这里SalesOrder对象就和具体的计税算法绑定到了一起,通常见到else if语句出现,就意味着需要重构。如果现在希望添加有一种新的国家税法,就要修改TaxBase遗以及SalesOrder。这就和“开闭原则”想违背了,该原则要求对拓展开放、对更改封闭。类模块应该用拓展的方式应对今后的变化。如何在SalesOrder中消除掉else if,将其与具体的计税算法解耦合?

    将不同国家的税法算法抽象成类

    SalesOrder类的写法也要相应的发生变化:

    SalesOrder的新写法

    通过封装、多态技术,将不同算法抽象成TaxStrategy的派生类,并实现计算相应税法的虚函数,以此来将SalesOrder与具体的税法算法解耦合。

    模式定义

    定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可以独立于使用它的客户程序而变化。———《设计模式》

    结构

    策略模式的结构

    其中Context和Strategy可以在Strategy的子类发生变的时候保持稳定、实现可复用

    要点总结

    Strategy及其子类为组件提供了一系列可重用的算法,从而使得类型在运行时方便的根据需要在各个算法之间进行切换。

    策略模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。

    如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。

    相关文章

      网友评论

          本文标题:GeekBand C++ 李建忠老师 设计模式

          本文链接:https://www.haomeiwen.com/subject/pcxrcttx.html