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

第二讲 策略模式

动机:

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

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

代码示例

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

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

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

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

SalesOrder的新写法

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

模式定义

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

结构


策略模式的结构

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

要点总结

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第一讲 课程目标 理解松耦合设计思想 掌握面向对象设计原则 掌握重构技法改善设计 掌握GOF核心设计模式 GOF设...
    带三本书阅读 3,719评论 0 1
  • 1. 设计模式简介 课程目标 理解松耦合设计思想 掌握面向对象设计原则 掌握重构技法改善设计 掌握GOF 核心设计...
    一般的路人丙阅读 2,174评论 0 2
  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 4,093评论 3 14
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 8,150评论 2 17
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 4,101评论 1 15

友情链接更多精彩内容