文章目录

  • Strategy 策略模式
    • 动机
    • 定义
    • 示例代码
    • 结构图
    • 总结

Strategy 策略模式

组件协作模式通过晚绑定,来实现框架与应用程序之间的松耦合。是框架和引用程序协作常用的。

动机

某些对象使用的算法可能多种多样,经常改变,将这些算法都编码到对象中,使对象变得异常复杂,而且有时支持不适用的算法也是一种性能负担。想要在运行时根据需要透明地更改对象的算法,就要将算法与对象本身解耦,从而避免上述问题。

定义

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

示例代码

enum TaxBase {CN_Tax,USA_Tax
};class SalesOrder {
private:TaxBase tax;
public:double CalculateTax() {// ...if (tax == CN_Tax) {// CN_...} else if (tax == USA_Tax) {// USA...}}
};

现有上面的示例代码,有一个 SalesOrder 类来计算税收,税现在有 CN_Tax 和 USA_Tax 类两种,用枚举表示,这里实现就根据 tax 的类型类做条件表达式的判读。 这样的代码还是在日常开发中蛮常见的,但是这样的代码有一个问题,就是当有需求变化时,我们即需要修改枚举类型,还要修改类的源代码。例如现在需要增加一个税收计算种类 FR_Tax,就需要将代码改成下面的形式:

enum TaxBase {CN_Tax,USA_Tax,FR_Tax // 新增代码
};class SalesOrder {
private:TaxBase tax;public:double CalculateTax() {// ...if (tax == CN_Tax) {// CN_...} else if (tax == USA_Tax) {// USA...} else if (tax == FR_Tax) { // 新增代码// FR...}}
};

其实上面这种方式就违背了开闭原则,即对修改封闭,对扩展开放。这种情况下,使用策略模式就是由上面的定义,将类型一个个封装起来:

class TaxStrategy {
public:virtual double Caculate(const Context& context) = 0;virtual ~TaxStrategy(){}
};class CNTax : public TaxStrategy {
public:virtual double Caculate(const Context& context) {// ...}
};class USATax : public TaxStrategy {
public:virtual double Caculate(const Context& context) {// ...}
}class SalesOrder {
private:TaxStrategy* strategy; // 使用指针实现多态public:SalesOrder(strategyFactory* strategyFactory) { // 工厂方法来生成对应子类this->strategy = strategyFactory->NewStrategy();}~SalesOrder() {delete this->strategy;}double CalculateTax() {// ...Context context;double val = strategy->Caculate(context); // 多态调用}
};

这个时候我们如果再想扩展 FR_Tax 类型则可以在上述代码的基础上,增加一个 TaxStrategy 的 FRTax 的子类(以及相应的工厂方法的子类)即可,无须再修改 SalesOrder 类的代码了。这里使用了工厂方法来生成子类对象,这部分不是本模式的重点,后面会详细介绍工厂方法。

class FRTax : public TaxStrategy {
public:virtual double Caculate(const Context& context) {// ...}
}

上述的方式就是 Strategy 策略模式的内容了。

结构图

总结

  • Strategy 策略模式及其子类为组件提供了一系列可重用的算法,从而是的类型在运行时方便地根据需要在各算法间进行切换。
  • 提供了条件判断语句之外的另一种选择。上面的例子可以看出,消除条件判断表达式就是在解耦合,含多个条件判断语句的代码通常都需要 stategy 模式。
  • 如果 Stategy 对象没有实例变量,上下文可以共享同一个对象,能节省对象开销。

其他设计模式汇总:
[设计模式] —— 设计模式的介绍及分类

[设计模式] —— Strategy 策略模式相关推荐

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

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

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

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

  3. C++设计模式之策略模式(Strategy)

    Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...

  4. 设计模式之策略模式(Strategy)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. 揭秘设计模式:策略模式(Strategy)的枚举(Enum)实现

    2019独角兽企业重金招聘Python工程师标准>>> 链接地址:http://www.xx566.com/detail/120.html 上一篇:揭秘设计模式:策略模式(Strat ...

  6. 锈才学设计模式之 —— 策略模式(Strategy Pattern)

    锈才学设计模式之  -- 策略模式 策略模式:把功能提供者单独封装成类,使它们可以互相替换使用,让功能提供者独立于使用者(调用者). 说明: 在面向对象编程中,我们尽量将功能(类)设计成复用,以符合O ...

  7. 【设计模式】2.Strategy 策略模式

    Strategy 策略模式 动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持不使用的算法也 ...

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

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

  9. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

最新文章

  1. 解决Debian-7.1下Chrome浏览器字体难看的问题
  2. Linux之shell脚本遍历文件夹下所有文件
  3. matlab中sign函数用法
  4. SAP 电商云 Spartacus SSR Optimization Engine 几处 timeout 的执行顺序
  5. 源码安装NASM,无root权限
  6. 上拉加载更多后台数据_微信小程序端操作云数据库
  7. 基于Python的ModbusTCP客户端实现
  8. ubuntu上安装python3.7教程_Day1: 如何在ubuntu 18.04中升级python 3.6到3.7
  9. 重写(覆盖)重载与多态
  10. Java基础知识学习(七)
  11. jQuery中的end()
  12. python分配问题_1.1python解决数学建模之席位分配问题
  13. 中兴 F607 光猫超级管理用户查看
  14. apkg格式怎么打开_jpg怎么转换成pdf?再不学就晚了
  15. IBC-身份标识密码技术
  16. hdoj 5510 Bazinga
  17. android 禁用触摸屏,Touch Protector-安卓禁用手机触摸屏软件
  18. handler机制--handler概览
  19. 安卓开发中必备的那些神器APP
  20. php利用飞信api给好友发短信

热门文章

  1. 基于FFMPEG的音视频截取(C++Qt 版)
  2. IOS网络第二天 - 05-黑酷-NSXMLparser解析(略)
  3. Java+MySQL 基于ssm的英语单词学习网站#毕业设计
  4. Disney验厂初审及跟进审核的定义与区别
  5. SMETA验厂审核知识大解读
  6. 智能路由器安全特性分析
  7. Github上比较优秀的Android项目
  8. 数字图像处理(3)图像增强(上)
  9. 怎么停止正在进行的Windows更新?
  10. 【Tool】CRC8 校验计算 X8 + X2 + X + 1