策略模式,就提供一系列应对不同情况的策略算法封装供使用对象选择实施。比如商场针对不同节日的打折方案,疫情针对不同风险区域的管控措施等这些我们可以看成是不同情况的策略算法,我们都可以提供一个统一的策略类接口以应对不同情况策略的选择,这样做的优点在于不同策略算法切换方便,同时避免了同时使用多重条件判断而且易于扩展;缺点就是对于使用者需清楚策略算法以便其选择,另外就是当策略算法增加时策略类会较多从而使代码更加臃肿。
策略模式的UML简图:
下面我们就通过一个简单的事例代码来具体了解我们的策略模式:
1. 抽象策略类(对应UML图中的AbstractStrategy类)及其子类(具体策略类)的定义;
#include <iostream>
using namespace std;
//策略对外统一接口的抽象类
class Strategy
{
public:
virtual void policy() = 0; //策略算法的统一对外接口函数
};
//具体策略类: 疫情低风险策略
class LowRiskStrategy: public Strategy
{
public:
virtual void policy() //具体的策略实施方案算法
{
cout << "可自由进出" << endl;
}
};
//具体策略类: 疫情中等风险策略
class MidRiskStrategy: public Strategy
{
public:
virtual void policy() //具体的策略实施方案算法
{
cout << "需凭48小时核酸检测进出" << endl;
}
};
//具体策略类: 疫情高风险策略
class HighRiskStrategy: public Strategy
{
public:
virtual void policy() //具体的策略实施方案算法
{
cout << "需居家隔离,并每天检测核酸" << endl;
}
};
2. 策略选择类(对应UML图中的Context类):
//实施选择策略的类: 区域类
class District
{
public:
//这里可以在本类中提供Strategy类的指针接口,以方便本类对Strategy其他接口的调用,这里为了简单好理解比没提供
void implementation(Strategy *stg) //实施选择策略的接口
{
stg->policy(); //调用对应策略算法
}
};
3. 主函数测试代码:
int main()
{
District chunxilu;
HighRiskStrategy *highRisk = new HighRiskStrategy;
LowRiskStrategy *lowRisk = new LowRiskStrategy;
cout << "春熙路升为高风险区域实施:";
chunxilu.implementation(highRisk);
cout << "春熙路降为低风险区域:";
chunxilu.implementation(lowRisk);
delete lowRisk;
lowRisk = nullptr;
delete highRisk;
highRisk = nullptr;
return 0;
}
4. 编译运行结果:
其实对于策略模式这里主要就策略抽象类和选择策略的对象类这两个类,其余具体的策略算法都是基于策略抽象类的扩展类,如代码里的低中高3个风险策略类。
注:这里为了方便大家对该设计模式结构的理解,故并没将类的定义与其接口定义分开(采用头文件与源文件的形式),大家在工程中实际使用时应当分开。