一、问题描述
请设计并实现一个收银软件,模拟超市中客户付费金额的计算过程。主要实现三种收费策略:(1)原价付费;(2)满X返Y,如满300返100;(3)打折,如打8折。
二、完成如下题目要求
画出静态图
(2)写出采用该设计模式的好处
1.定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
2.可以动态的改变对象的行为
3.低耦合
4.使得具体的收费算法彻底的与客户端分离
5.可以以相同的方式调用所有的算法,减少了各类算法类与使用算法类之间的耦合
6.简化了单元测试,可以通过自己的接口单独测试
(3)编写代码
#include<bits/stdc++.h>
using namespace std;
//现金收费抽象类
class CashSuper
{
public:
virtual double acceptCash(double money)=0;
};
//正常收费子类
class CashNormal: public CashSuper
{
public:
double acceptCash(double money)
{
return money;
}
};
//折扣收费子类
class CashRebate: public CashSuper
{
private:
double moneyRebate=1;
public:
CashRebate(double moneyRebate1)//折扣率
{
moneyRebate=moneyRebate1;
}
double acceptCash(double money)
{
return money*moneyRebate;
}
};
//返利收费子类
class CashReturn: public CashSuper
{
private:
double moneyCondition=0.0;
double moneyReturn=0.0;
public:
CashReturn(double moneyCondition1,double moneyReturn1)
{
moneyCondition=moneyCondition1;
moneyReturn=moneyReturn1;
}
double acceptCash(double money)
{
double result=money;
if(money>=moneyCondition)//若大于返利条件,则需要减去返利值
{
result=money-floor(money/moneyCondition)*moneyReturn;
}
return result;
}
};
//CashContext上下文类
class CashContext
{
private:
CashSuper* cs;//声明一个CashSuper对象
public:
CashContext(CashSuper* csuper)//通过构造方法,传入具体的收费策略
{
this->cs=csuper;
}
double GetResult(double money)
{
return this->cs->acceptCash(money);//根据收费策略的不同,获得计算结果
}
};
void menu()
{
cout<<"************************"<<endl;
cout<<"1.正常收费"<<endl;
cout<<"2.满300返100"<<endl;
cout<<"3.打八折"<<endl;
cout<<"0.退出"<<endl;
cout<<"请选择:"<<endl;
cout<<"************************"<<endl;
}
//主函数
int main()
{
double total=0.0;//总计
CashContext *cc=NULL;
int flag=1;//标记(退出)
while(1)
{
menu();
int sel;
cin>>sel;
switch(sel)
{
case 1:
cc=new CashContext(new CashNormal());
break;
case 2:
cc=new CashContext(new CashReturn(300,100));
break;
case 3:
cc=new CashContext(new CashRebate(0.8));
break;
case 0:
flag=0;
break;
}
if(flag==0)
break;
double totalPrices=0;//每个商品合计
double Price;//单价
double Num;//数量
cout<<"请输入单价:"<<endl;
cin>>Price;
cout<<"请输入数量:"<<endl;
cin>>Num;
totalPrices=cc->GetResult(Price*Num);
total+=totalPrices;
cout<<"单价:"<<Price<<endl;
cout<<"数量:"<<Num<<endl;
cout<<"单个商品合计"<<totalPrices<<endl;
}
cout<<"总计"<<total<<endl;
return 0;
}