-
策略模式:一种行为型设计模式
-
应用场景:
在GOF的《设计模式:可复用面向对象软件的基础》中是这样定义的:将一系列的算法一个个封装起来,并且使它们可相互替换。策略模式使得算法可独立于使用它的客户而变化。
对于同一流程中不同的需求,对数据的处理算法可能会变更,所以将处理数据的算法单独抽离出去,形成一系列算法类,可以相互替换。 -
举例:
《大话设计模式》中举了一个很好的例子。
商场经常会推出不同的优惠活动,对于结账流程来说,不同的优惠活动会使用不同的算法处理账单总额。
所以抽离出一个算法的基类,提供统一的用于计算折后价的接口,然后所有的算法都在派生类中实现各自的方法。
切换商场类中的算法指针所指向的算法类,即可切换调用的算法。 -
实现方式:
所有算法类派生自同一基类,实现统一的计算接口。
商场类中使用成员指针指向具体的算法类,结账时通过该指针调用算法。
以下是策略模式的简单代码实现
#include <iostream>
using namespace std;
//策略基类
class Strategy
{
public:
virtual float Calculate(float fTotal) = 0;
};
//策略A,打8折
class StrategyA:public Strategy
{
public:
virtual float Calculate(float fTotal)
{
printf("优惠活动,全部8折\n");
return fTotal * 0.8;
}
};
//策略B,打7折
class StrategyB:public Strategy
{
public:
virtual float Calculate(float fTotal)
{
printf("优惠活动,全部7折\n");
return fTotal * 0.7;
}
};
//策略C,满300减100
class StrategyC:public Strategy
{
public:
virtual float Calculate(float fTotal)
{
printf("优惠活动,满300减100\n");
float fFinal = fTotal - static_cast<int>(fTotal/300) * 100;
return fFinal;
}
};
//商场类
class Shop
{
public:
Shop(Strategy* pStrategy = NULL):m_pStrategy(pStrategy){}
~Shop()
{
if(m_pStrategy)
{
delete m_pStrategy;
m_pStrategy = NULL;
}
}
//设置商场策略
void SetStrategy(Strategy* pStrategy)
{
if(m_pStrategy)
{
delete m_pStrategy;
}
m_pStrategy = pStrategy;
}
//调用策略类的计算方法计算折后价
void CalculatePay(float fTotal)
{
if(m_pStrategy)
{
float fFinal = m_pStrategy->Calculate(fTotal);
printf("原价:%.2f元, 折后:%.2f元\n", fTotal, fFinal);
}
else
{
printf("无活动,总价:%.2f元\n", fTotal);
}
}
private:
Strategy* m_pStrategy;
};
主函数中的使用
int main()
{
Shop oShop;
oShop.CalculatePay(400);
oShop.SetStrategy(new StrategyA());
oShop.CalculatePay(400);
oShop.SetStrategy(new StrategyB());
oShop.CalculatePay(400);
oShop.SetStrategy(new StrategyC());
oShop.CalculatePay(400);
return 0;
}
控制台输出结果
无活动,总价:400.00元
优惠活动,全部8折
原价:400.00元, 折后:320.00元
优惠活动,全部7折
原价:400.00元, 折后:280.00元
优惠活动,满300减100
原价:400.00元, 折后:300.00元
如有错误,欢迎指正
网友评论