策略模式
策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。
Context(应用场景)
1、需要使用ConcreteStrategy提供的算法
2、内部维护一个Strategy的实例
3、负责动态设置运行时Strategy具体的实现算法
4、负责跟Startegy之间的交互和数据传递
Startegy(抽象策略类)
1、定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现
ConcreteStrategy(具体策略类)
1、实现了Strategy定义的接口,提供具体的算法实现
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
class CashSuper
{
public:
virtual double acceptMoney(double money)=0;
};
class CashNormal : public CashSuper
{
public:
double acceptMoney(double money)
{
return money;
}
};
class CashRebate : public CashSuper
{
private:
double discount;
public:
CashRebate(double dis)
{
discount =dis;
}
double acceptMoney(double money)
{
return money*discount;
}
};
class CashReturn : public CashSuper
{
private:
double moneyCondition;
double moneyReturn;
public:
CashReturn(double mc,double mr)
{
moneyCondition=mc;
moneyReturn=mr;
}
double acceptMoney(double money)
{
double result=money;
if(money>=moneyCondition)
{
result=money-floor(money/moneyCondition)*moneyReturn;
}
return result;
}
};
class CashContext
{
private:
CashSuper *cs;
public:
CashContext(string str)
{
if(str=="正常消费")
{
cs=new CashNormal();
}
else if (str=="打9折")
{
cs=new CashRebate(0.9);
}
else if(str=="满1000送200")
{
cs=new CashReturn(1000,200);
}
}
double getResult(double money)
{
return cs->acceptMoney(money);
}
};
int main()
{
double money=1000;
CashContext *cc=new CashContext("正常收费");
cout<<cc->getResult(money);
return 0;
}