策略模式简单实现(与前一篇同样的案例,代码稍作改动)

来源:互联网 发布:桌面摆件 知乎 编辑:程序博客网 时间:2024/05/28 22:10

/*****This file is to implement a cashier system*****//*****Basic Function:Choose Fruit*****//*****Basic Funciton:Choose Valuation Method******//*****Author:liangmz******//*****Date:2017/09/28*****//******策略模式的应用*****/#include <iostream>#include <stdlib.h>#include <vector>enum EValuation{NO_DISCOUNT=0,DISCOUNT,MEETMINUS};using namespace std;class CFruits{private:double t_count;double t_price;public:void SetCount(double count){t_count =count;}void SetPrice(double price){t_price =price;}double GetPrice(){return this->t_price;}double GetCount(){return this->t_count;}};class CFruitBasket{private:vector <CFruits> m_vfruits;double m_total;public:CFruitBasket(vector <CFruits> vfruits){m_vfruits = vfruits;m_total = 0;}virtual ~CFruitBasket(){}void SetFruit(vector <CFruits> fruits){m_vfruits = fruits;}virtual double GetTotal(){for(vector<CFruits>::iterator iter=m_vfruits.begin();iter!=m_vfruits.end();iter++){cout<<(*iter).GetCount()<<endl;m_total += (*iter).GetPrice()*(*iter).GetCount();}return m_total;}};class CDiscount:public CFruitBasket{private:double m_rate;public:CDiscount(vector <CFruits> vfruits,double rate):CFruitBasket(vfruits){m_rate =rate;}double GetRate(){cout << "Rate is :"<<m_rate<<endl;return this->m_rate;}virtual double GetTotal(){double ret = CFruitBasket::GetTotal()*m_rate;return ret;}};class CMeetMinus:public CFruitBasket{private:double m_least;double m_minus;public:CMeetMinus(vector <CFruits> vfruits,double least,double minus):CFruitBasket(vfruits){m_least= least;m_minus = minus;}double GetMinus(){return m_minus;}double GetLeast(){return m_least;}double GetTotal(){double ret = CFruitBasket::GetTotal();if(ret>m_least){return (ret-m_minus);}elsereturn ret;}};class CValuation{private:CFruitBasket *m_pbasket;public:CValuation(vector <CFruits> vfruits,EValuation etype){switch(etype){case NO_DISCOUNT:m_pbasket = new CFruitBasket(vfruits);break;case DISCOUNT:m_pbasket = new CDiscount(vfruits,0.8);break;case MEETMINUS:m_pbasket = new CMeetMinus(vfruits,100,20);break;default:m_pbasket = NULL;cout<<"Input error!"<<endl;break;}}double GetTotal(){if(m_pbasket==NULL){cout<<"Empty basket"<<endl;return 0;}else{cout<<"Calculate over!!!"<<endl;return m_pbasket->GetTotal();}}};int main(){CFruits Apple;Apple.SetPrice(4);Apple.SetCount(5);cout << "Apple Price is :"<<Apple.GetPrice()<<endl;CFruits Orange;Orange.SetPrice(3);Orange.SetCount(10);cout << "Orange Price is :"<<Orange.GetPrice()<<endl;CFruits Durian;Durian.SetPrice(18.8);Durian.SetCount(5);cout << "Durian Price is :"<<Durian.GetPrice()<<endl;vector <CFruits> vfruits;vfruits.push_back(Apple);vfruits.push_back(Orange);vfruits.push_back(Durian);cout<<"Please enter your choice:"<<endl;int in;cin>>in;CValuation guestA(vfruits,(EValuation)in);cout<<"Total is :"<<guestA.GetTotal()<<endl;return 0;}

前一篇利用了类似于简单工厂的模式实现了超市收银功能,实际上类似的场景更使用策略模式,代码需要稍作修改,具体如下


阅读全文
0 0
原创粉丝点击