这是大话设计模式中的策略模式的c++版本
//策略模式
#include <iostream>
using namespace std;
enum Cash_type
{
NORMALL_CASH = 0,
RETURN_CASH = 1,
DISCOUNT = 2,
};
//虚基类cashsuper
class CashSuper
{
public:
//打折函数
double virtual acceptCash(double money)=0;
//虚析构函数
virtual ~CashSuper(){};
};
//正常收费子类
class CashNormal :public CashSuper
{
public:
double acceptCash(double money) override
{
//正常返回
return money;
}
};
//打折收费类
class CashRebate:public CashSuper
{
public:
//打折收费
CashRebate(double moneyRebate)
{
_moneyReabate = moneyRebate;
}
double acceptCash(double money) override
{
return money * _moneyReabate;
}
private:
double _moneyReabate = 0;
};
//返利收费,超过设定金额,全部的数值就加入返利计算
class CashReturn:public CashSuper
{
public:
CashReturn(double moneyCondition,double moneyReturn)
{
_moneyCondition = moneyCondition;
_moneyReturn = moneyReturn;
}
double acceptCash(double money) override
{
double result = money;
if(money >= _moneyCondition)
{
result = money - (money/_moneyCondition) * _moneyReturn;
}
return result;
}
private:
//返利条件
double _moneyCondition = 0;
//返利数值
double _moneyReturn = 0;
};
//定义所有支持的算法的公共接口
class CashContext
{
public:
double GetResult(double money)
{
return _cs->acceptCash(money);
}
//将工厂的对象实例化过程转移至此实现与工厂方法的结合
CashContext(Cash_type type)
{
switch(type)
{
case NORMALL_CASH:
_cs = new CashNormal();
break;
case RETURN_CASH:
_cs = new CashReturn(300,100);
break;
case DISCOUNT:
_cs = new CashRebate(0.8);
break;
}
}
private:
CashSuper *_cs;
};
int main()
{
double cash = 500;
//获取收费策略
CashContext *csuper = new CashContext(RETURN_CASH);
//将传入金额
cout<<"在现有优惠策略下消费"<<cash<<",实际支付的金额是:"<<csuper->GetResult(cash)<<endl;
return 0;
}
测试输出:
在现有优惠策略下消费500,实际支付的金额是:333.333
策略模式优点:
1.减少了算法类与使用算法类的耦合
2.有助于提取出算法中的公共功能
3.简化单元测试
缺点:
改变的成本比较大
转载请注明源地址:http://blog.csdn.net/clh01s