c++设计模式——策略模式
-
定义
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们相互之间可以替换。策略模式让算法独立于使用它的客户而独立变化。
- 角色
- 抽象策略角色(strategy):抽象策略类
- 具体策略角色(concrete strategy):封装了相关的算法和行为
- 环境角色(context):持有一个策略类的引用,最终给客户端调用
- 模式图
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB10MjpnTyMGROBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzETN0UTOwMTM3IzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
- 应用场景
- 需要使用ConcreteStrategy提供的算法。
- 内部维护一个strategy的实例
- 负责动态设置运行时strategy具体的实现算法
- 负责strategy之间的交互和数据传递
- 优点
- 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护。
- 策略模式让你可以动态的改变对象的行为,动态修改策略
- 缺点
- 客户端必须知道所有的策略类,并自行决定使用哪种策略
- 类过多的问题。策略模式造成了很多策略类,每个具体策略类都会产生一个新类。(可以使用享元模式来克服类过多的问题)
-
实例
空调的三种运行模式;
- 冷风模式
- 热风模式
- 无风模式
三种运行模式就是ConcreteStrategy。
代码实现如下:
测试代码如下strategy.h# ifndef _STRATEGY_H_ # define _STRATEGY_H_ using namespace std; typedef enum WindMode{ COLDMODE = 0, WARMMODE, NOMODE }MODE; class Wind{ public: virtual void IWind() = 0; }; class ColdWind:public Wind{ public: void IWind(){ cout << "this is ColdWind" << endl; } }; class WarmWind:public Wind{ public: void IWind(){ cout << "this is WarmWind" << endl; } }; class NoWind:public Wind{ public: void IWind(){ cout << "this is NoWind" << endl; } }; class Context{ public: Wind * wind; Context(MODE mode){ switch(mode){ case COLDMODE: wind = new ColdWind(); break; case WARMMODE: wind = new WarmWind(); break; case NOMODE: wind = new NoWind(); break; default: wind = nullptr; } } ~Context(){ if(nullptr != wind){ delete wind; wind = nullptr; } } }; # endif
测试结果:# include <iostream> # include "strategy.h" using namespace std; int main(int argc ,char ** argv){ Context * cold_context = new Context(COLDMODE); Context * warm_context = new Context(WARMMODE); Context * no_context = new Context(NOMODE); cold_context->wind->IWind(); warm_context->wind->IWind(); no_context->wind->IWind(); if(nullptr != cold_context){ delete cold_context; cold_context = nullptr; } if(nullptr != warm_context){ delete warm_context; warm_context = nullptr; } if(nullptr != no_context){ delete no_context; no_context = nullptr; } return 0; }
[[email protected] designMode]$ g++ strategy_test.cc -std=c++11 [[email protected] designMode]$ ./a.out this is ColdWind this is WarmWind this is NoWind