策略模式简单实现(与前一篇同样的案例,代码稍作改动)
来源:互联网 发布:桌面摆件 知乎 编辑:程序博客网 时间: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
- 策略模式简单实现(与前一篇同样的案例,代码稍作改动)
- 设计模式实现(二)---策略模式、策略模式与简单工厂模式结合使用
- 策略模式与简单工厂的C++实现
- 设计模式解读 之策略模式(参照策略模式与简单工厂模式的对比)
- 设计模式解读 之策略模式(参照策略模式与简单工厂模式的对比)
- 策略模式:策略模式与简单工厂模式的异同
- 见到的一篇IOCP流程 自己用demo实现了一下, 简单照抄,改动了一点点
- 设计模式-代理模式与适配器模式实现代码重用以及策略模式的使用
- 设计模式之策略模式(包含与简单工厂模式的区别,实现了超市结账系统)
- 简单工厂设计模式实现商店买牙膏收费案例过渡到结合策略模式的理由全解
- HEAD_FIRST设计模式学习 ----策略模式 c++简单实现代码
- 策略模式的实现的简单Demo
- 缓存策略的改动
- 策略模式(附Head First策略模式的C++代码实现)
- 简单工厂与策略模式的区别
- 简单工厂与策略模式的结合
- 浅谈简单工作流设计——责任链模式配合策略与命令模式的实现
- JAVA——动态代理(在别人的基础上稍作改动)
- ReactNative源码篇
- windows下的tensorflow下载安装
- 查找单链表的倒数第k个节点,要求只能遍历一次链表
- zTree树形插件使用 同步加载
- 浅谈Spring的Ioc和AOP
- 策略模式简单实现(与前一篇同样的案例,代码稍作改动)
- leetcode easy题page1小结
- 人群密度估计--CrowdNet: A Deep Convolutional Network for Dense Crowd Counting
- 考研太苦逼没坚持下来!看苑老师视频有点上头
- Fragment生命周期
- android Camera 架构简介
- winform 控件及其各个属性
- 欢迎使用CSDN-markdown编辑器
- oracle asmlib固化磁盘