//用策略模式实现商场收费系统
#include <iostream>
using namespace std;
//现金收费抽象类
//抽象产品:抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
class CashSuper
{
public:
virtual double acceptCash(double money)=0; //纯虚函数:在函数原型后加"=0"
};
//具体产品:具体产品角色(子类)是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
//正常收费子类
class CashNormal:public CashSuper
{
public:
virtual double acceptCash(double money)
{
return money;
}
};
//打折收费子类
class CashReBate:public CashSuper
{
private:
double moneyRebate=0;
public:
CashReBate(double rebate)
{
this->moneyRebate = rebate;
}
virtual double acceptCash(double money)
{
return money*moneyRebate;
}
};
//返利收费子类
class CashReturn:public CashSuper
{
private:
double moneyCondition=100;
double moneyReturn=50;
public:
CashReturn(double Condition,double Return)
{
this->moneyCondition = Condition;
this->moneyReturn = Return;
}
virtual double acceptCash(double money)
{
double result = money;
if(money >= moneyCondition)
{
result = money - moneyReturn;
}
return result;
}
};
//在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
//Context 类:维护一个对抽象算法类对象的引用
class CashContext
{
private:
CashSuper* cs;
public:
void SetCashContext(CashSuper* c)
{
this->cs = c;
}
double ContextIntetface(double money)
{
return cs->acceptCash(money);
}
};
//由于实例化不同的策略,最终在调用context->ContextInterface()时,所获得的结果就不尽相同。
int main()
{
int type=3;
CashContext* cc = new CashContext;
switch (type)
{
case 1:
cc->SetCashContext(new CashNormal());
break;
case 2:
cc->SetCashContext(new CashReturn(100,50));
break;
case 3:
cc->SetCashContext(new CashReBate(0.8));
break;
}
cout<<cc->ContextIntetface(100)<<endl;
system("pause");
return 0;
}
设计模式——策划模式(C++)——商场收费系统
最新推荐文章于 2022-03-07 00:07:22 发布