Strategy 策略模式

动机(Motivation)

  • 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担(许多ifelse不被使用,占用缓存位置等等)。
  • 如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?

模式定义

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

=个人理解 抽象类靠向开闭=

要点总结

  • Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时(运行时传递多态对象,运行时执行多态调用),方便地根据需要在各个算法之间进行切换。

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

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

  • 如果代码里出现大量if else/switch case 可能就是策略模式需要出现的特征。
    以拓展的方式,支持未来的变化。
  • 但if else在绝对不变的情况下,不需要用策略模式。例如根据性别判断。

结构

红稳定 蓝不稳

例子

改之前

enum TaxBase {CN_Tax,US_Tax,DE_Tax,FR_Tax       //更改,违反开闭
};class SalesOrder{TaxBase tax;
public:double CalculateTax(){//...if (tax == CN_Tax){//CN***********}else if (tax == US_Tax){//US***********}else if (tax == DE_Tax){//DE***********}else if (tax == FR_Tax){  //更改 // 这样修改也并不算是一种真正的复用,真正的复用是 编译单位 二进制的复用。// 这是源代码片段级的复用,这是拷贝粘贴//...}//....}};

策略模式


class TaxStrategy{public:virtual double Calculate(const Context& context)=0;virtual ~TaxStrategy(){}
};class CNTax : public TaxStrategy{public:virtual double Calculate(const Context& context){//***********}
};class USTax : public TaxStrategy{public:virtual double Calculate(const Context& context){//***********}
};class DETax : public TaxStrategy{public:virtual double Calculate(const Context& context){//***********}
};//扩展
//*********************************
class FRTax : public TaxStrategy{public:virtual double Calculate(const Context& context){//.........}
};class SalesOrder{private:TaxStrategy* strategy;public:// 工厂模式 返回堆对象,后面讲SalesOrder(StrategyFactory* strategyFactory){this->strategy = strategyFactory->NewStrategy();}~SalesOrder(){delete this->strategy;}public double CalculateTax(){//...Context context();double val = strategy->Calculate(context); //多态调用//...}};

【设计模式】2.Strategy 策略模式相关推荐

  1. 设计模式之Strategy策略模式

    文章目录 前言 一.Strategy策略模式 二.策略模式原则 三.使用场景 1.先做比较练习 2.为一组对象排序 3.使用Lambda表达式的方式 前言 本人对于设计模式的学习,仅供参考! 一.St ...

  2. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  3. Java的设计模式----strategy(策略模式)

    设计模式: 一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精 ...

  4. 设计模式——Strategy(策略)模式

    目录 前言 1 定义 2 适用性 3 结构 3.1 结构图 3.2 参与者 4 实际应用举例 4.1 Context--List列表和StuContext 4.2 具体策略:ConcreteStrat ...

  5. [设计模式] —— Strategy 策略模式

    文章目录 Strategy 策略模式 动机 定义 示例代码 结构图 总结 Strategy 策略模式 组件协作模式通过晚绑定,来实现框架与应用程序之间的松耦合.是框架和引用程序协作常用的. 动机 某些 ...

  6. JAVA中的设计模式三(策略模式)

    问题: 如何让算法和对象分开来,使得算法可以独立于使用它的客户而变化? 方案: 把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以 ...

  7. 设计模式入门(策略模式)

    [0]README 0.1)本文部分文字描述转自 "head first 设计模式",旨在学习 设计模式入门(策略模式) 的基础知识: 0.2)本文章节4和5的source cod ...

  8. 读书 | 设计模式之禅 - 策略模式

    文章目录 1. 引入策略模式 2. 策略模式定义 3. 策略模式的优点 1. 引入策略模式 智谋无敌的诸葛亮,在刘备去东吴招亲之前,特授以伴郎赵云三个锦囊,说是按天机拆开解决棘手问题. 这三个妙计分别 ...

  9. 设计模式学习笔记--Strategy 策略模式

    所谓策略模式(Strategy Pattern),就是将策略 (算法) 封装为一个对象,易于相互替换,如同 USB 设备一样可即插即用:如果将策略.具体的算法和行为,编码在某个类或客户程序内部,将导至 ...

最新文章

  1. Python中由生成杨辉三角代码所思考的一些问题
  2. mysql 硬盘写入速度_MySQL存储写入速度慢分析
  3. Explain:解决MUI 软键盘弹起挤压页面问题
  4. php对应哪个oracle版本,Oracle 版本说明
  5. Docker学习笔记_安装和使用Apache
  6. IDEA下svn配置与share project
  7. Java中的类型推断和lambda表达式
  8. 代码调用NullPointerException(NPE)
  9. Android+微信 弹出层无法滚动?
  10. 玩游戏用固态硬盘还是机械硬盘
  11. html 怎么几秒后自动隐藏,js设定DIV显示时间并动态显示时间倒计时多少秒,倒计时完了之后该层自动隐藏。...
  12. 虚幻4 ai蓝图_高效AI自我监督学习的迷人蓝图
  13. 计算机软考高级论文怎么写,【干货】软考高级论文怎么写易得高分?
  14. 三村合建水厂问题研究 (代码)
  15. docker-nividia run 报错
  16. C++实现小写转大写
  17. [转] 当猫爱上蝴蝶
  18. iOS开发脚踏实地学习day14-绘图
  19. 图片加密(一)颜色加密
  20. python共享文件协同编辑_那些可多人协作编辑的在线文档工具

热门文章

  1. 音频格式怎么转换?安利下面这几个方法给你
  2. 未来已来:大数据和人工智能浪潮下的未来进化
  3. 魅族16php7.3系统,Flyme7.3稳定版安排上了!魅族16系列和X8都率先支持
  4. 32套无碳小车重力势能小车8字型S型工程训练大赛sw建模3D图纸设计
  5. Exchange 服务器网卡引起的复制队列过高问题!
  6. 华为宣布与美国信息基础架构设备设计公司路坦力合作
  7. GitHub多账号密钥配置
  8. QQ空间 免费代码大全
  9. Ubuntu20,opencv4,cere14编译vins报错
  10. C#中socket编程中文乱码