[设计模式] —— Strategy 策略模式
文章目录
- 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 策略模式相关推荐
- Java的设计模式----strategy(策略模式)
设计模式: 一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精 ...
- 设计模式——Strategy(策略)模式
目录 前言 1 定义 2 适用性 3 结构 3.1 结构图 3.2 参与者 4 实际应用举例 4.1 Context--List列表和StuContext 4.2 具体策略:ConcreteStrat ...
- C++设计模式之策略模式(Strategy)
Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...
- 设计模式之策略模式(Strategy)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 揭秘设计模式:策略模式(Strategy)的枚举(Enum)实现
2019独角兽企业重金招聘Python工程师标准>>> 链接地址:http://www.xx566.com/detail/120.html 上一篇:揭秘设计模式:策略模式(Strat ...
- 锈才学设计模式之 —— 策略模式(Strategy Pattern)
锈才学设计模式之 -- 策略模式 策略模式:把功能提供者单独封装成类,使它们可以互相替换使用,让功能提供者独立于使用者(调用者). 说明: 在面向对象编程中,我们尽量将功能(类)设计成复用,以符合O ...
- 【设计模式】2.Strategy 策略模式
Strategy 策略模式 动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持不使用的算法也 ...
- 设计模式之Strategy策略模式
文章目录 前言 一.Strategy策略模式 二.策略模式原则 三.使用场景 1.先做比较练习 2.为一组对象排序 3.使用Lambda表达式的方式 前言 本人对于设计模式的学习,仅供参考! 一.St ...
- 设计模式:策略模式(Strategy)
定 义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...
最新文章
- 解决Debian-7.1下Chrome浏览器字体难看的问题
- Linux之shell脚本遍历文件夹下所有文件
- matlab中sign函数用法
- SAP 电商云 Spartacus SSR Optimization Engine 几处 timeout 的执行顺序
- 源码安装NASM,无root权限
- 上拉加载更多后台数据_微信小程序端操作云数据库
- 基于Python的ModbusTCP客户端实现
- ubuntu上安装python3.7教程_Day1: 如何在ubuntu 18.04中升级python 3.6到3.7
- 重写(覆盖)重载与多态
- Java基础知识学习(七)
- jQuery中的end()
- python分配问题_1.1python解决数学建模之席位分配问题
- 中兴 F607 光猫超级管理用户查看
- apkg格式怎么打开_jpg怎么转换成pdf?再不学就晚了
- IBC-身份标识密码技术
- hdoj 5510 Bazinga
- android 禁用触摸屏,Touch Protector-安卓禁用手机触摸屏软件
- handler机制--handler概览
- 安卓开发中必备的那些神器APP
- php利用飞信api给好友发短信