22 【行为型】策略模式-Strategy
实际项目:
1、有各种鸭子,各个鸭子不同行为,显示出来;
2、商场打折、促销满减、积分兑换等活动
基本介绍:
1、策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
2、这算法体现了几个设计原则:
- 把变化的代码从不变的代码中分离出来;
- 针对接口编程而不是具体类(定义了策略接口)
- 多组合/聚合少用继承(客户通过组合方式使用策略);
原理类图:

/*
* @Description:
* @Remark:
* @Author: whl
* @博客园: https://www.cnblogs.com/cnwhl/
* @Date: 2021-12-21 15:40:40
* @LastEditTime: 2021-12-28 21:13:11
*/
#include <iostream>
using namespace std;
/**
* @description: 策略接口类
* @Remark: 定义所有算法或者行为的抽象接口
*/
class Strategy
{
public:
virtual void StrategyInterface() = 0;
};
/**
* @description: 具体策略实现类
* @Remark: 实现具体的算法或者行为,继承于Strategy类
*/
class ConcreteStrategyA: public Strategy
{
public:
void StrategyInterface()
{
cout << "A 算法实现" << endl;
}
};
class ConcreteStrategyB: public Strategy
{
public:
void StrategyInterface()
{
cout << "B 算法实现" << endl;
}
};
class ConcreteStrategyC: public Strategy
{
public:
void StrategyInterface()
{
cout << "C 算法实现" << endl;
}
};
/**
* @description: Context上下文
* @Remark: 用一个ContextStrategy来配置,维护一个对Strategy对象的引用
*/
class StrategyContext
{
public:
StrategyContext(Strategy* pContext)
{
m_pStrategy = pContext;
}
void ContextStrategy(){
m_pStrategy->StrategyInterface();
}
private:
Strategy* m_pStrategy;
};
int main()
{
ConcreteStrategyA* pA = new ConcreteStrategyA();
ConcreteStrategyB* pB = new ConcreteStrategyB();
ConcreteStrategyC* pC = new ConcreteStrategyC();
StrategyContext* pStrategyContext = NULL;
pStrategyContext = new StrategyContext(pA);
pStrategyContext->ContextStrategy();
pStrategyContext = new StrategyContext(pB);
pStrategyContext->ContextStrategy();
pStrategyContext = new StrategyContext(pC);
pStrategyContext->ContextStrategy();
return 0;
}思路分析:
1、“商场收银时如何促销,用打折还是返利,其实都是一些算法,用工厂来生成算法对象,这没有错,但算法本身只是一种策略,最重要的是这些算法是随时都可能互相替换的,这就是变化点,而封装变化点是我们面向对象的一种很重要的思维方式
2、策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合
3、优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试;
4、结合工厂模式和“反射技术”,策略模式应用起来会更加方便;
注意事项和细节:
1、策略模式的关键是:分析项目中变化部分与不变部分;
2、核心思想:多用组合/聚合,少用继承,用行为类组合,而不是行为的继承,更有弹性;
3、体现了“开闭原则”,客户端增加行为不用修改原有代码,只是增加一种策略(行为)即可;避免了使用多重转移语句(if else)
4、提供了可以替换继承关系的办法:策略模式将算法封装在独立的strategy类中使你可以独立于其context改变它,是他易于切换,易于理解,易于扩展;
5、注意的是:每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大;

浙公网安备 33010602011771号