大话设计模式笔记——策略模式(C++超市收银实现)
来源:互联网 发布:用户角色模型 java 编辑:程序博客网 时间:2024/05/01 12:26
可能没耐心的同学看大话设计模式的时候,在策略模式有点晕,看着跟工厂模式差不多一样。
其实我想说,他们两个的区别就跟吃炒菜和吃快餐的区别。
快餐就是把几份不同的炒菜给你放到一个盘子里。
吃炒菜的时候,我们要吃到不同的菜,只能每次往想要的盘子去夹。吃快餐的话,我们只需要知道自己想吃的菜,然后在餐盘里夹就可以了。
快餐对炒菜做了一次封装而已。
优点:策略模式定义了一系列的方法,这些方法都完成相同的工作,但是实现不同。我们使用相同的方式来调用算法,减少了算法类本身和使用算法类的耦合。
另一个优点简化了单元测试,每个算法都是一个子类,可以分别单独测试。
以下是我C++实现的代码,里面都有注释,大家可以看到前面的父子类都一模一样。
//// main.cpp// Strategy//// Created by Ben_22 on 14-5-29.// Copyright (c) 2014年 Ben_22. All rights reserved.//#include <iostream>using namespace::std;/*三种收费类型 CASHNORMAL 正常模式 CASHREBATE 八折 CASHRETURN 消费三百返一百 */enum CashType {CASHNORMAL, CASHREBATE, CASHRETURN };//抽象类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 rebate){ moneyRebate = rebate; } double acceptCash(double money){ return money*moneyRebate; } void setRebate(double rebate){ moneyRebate = rebate; }};//消费三百返一百class CashReturn : public CashSuper{private: double moneyCondition = 0.0; double moneyReturn = 0.0;public: CashReturn(double condMoney, double retMoney){ moneyCondition = condMoney; moneyReturn = retMoney; } void setData(double condMoney, double retMoney){ moneyCondition = condMoney; moneyReturn = retMoney; } double acceptCash(double money){ double result; if (money > moneyCondition) { result = moneyCondition - moneyReturn; } return result; }};/*************工厂模式工厂的实现start*****************/class CashFactory {public: static CashSuper *createCash(CashType type){ CashSuper *pCashSuper = nullptr; switch (type) { case CASHNORMAL: pCashSuper = new CashNormal(); break; case CASHREBATE: pCashSuper = new CashRebate(0.8); break; case CASHRETURN: pCashSuper = new CashReturn(300, 100); break; default: break; } return pCashSuper; }};/*************工厂模式工厂的实现end*****************//*************策略模式的实现start*****************/class CashContext{private: CashSuper *oCashSuper;public: CashContext( CashSuper *mCashSuper){ oCashSuper = mCashSuper; } double getResutl(double money){ return oCashSuper->acceptCash(money); } };/*************策略模式的实现end****************** *以前工厂模式只是把三种收款模式生成了三种对象,我们根据返回的对象来进行操作。 *而策略模式则是把三种收款模式作为三种策略 *我们在上层再封装一个类来根据我们选择的策略来直接返回结果。 ***********************************************//**********改进的工厂和策略结合的模式start***********/class CashContextPro{private: CashSuper *pCashSuper;public: CashContextPro( CashType type ){ switch (type) { case CASHNORMAL: pCashSuper = new CashNormal(); break; case CASHREBATE: pCashSuper = new CashRebate(0.8); break; case CASHRETURN: pCashSuper = new CashReturn(300, 100); break; default: break; } } double getResutl(double money){ return pCashSuper->acceptCash(money); }};/**********改进的工厂和策略结合的模式end***********/int main(int argc, const char * argv[]){ double userMoney = 333; //工厂模式操作 cout<<"实际付款:"<<CashFactory::createCash(CASHREBATE)->acceptCash(userMoney)<<endl; //策略模式操作 CashContext *objCash = new CashContext(CashFactory::createCash(CASHREBATE)); cout<<"实际付款:"<<objCash->getResutl(userMoney)<<endl; //改进的 工厂和策略模式结果 CashContextPro *objCashPro = new CashContextPro( CASHREBATE ); cout<<"实际付款:"<<objCashPro->getResutl(userMoney)<<endl; return 0;}
2 0
- 大话设计模式笔记——策略模式(C++超市收银实现)
- 策略模式学习代码(用反射实现超市收银功能)
- 大话设计模式——策略模式(C++实现)
- 大话设计模式 笔记2——策略模式
- 【大话设计模式】——策略模式
- 大话设计模式——策略模式
- 大话设计模式—策略模式
- 大话设计模式学习(二)——策略模式
- 【大话设计模式——学习笔记(2)】策略模式
- 《大话设计模式》--笔记(策略模式)
- 大话设计模式笔记----策略模式
- 策略模式---《大话设计模式》笔记
- 大话设计模式学习笔记---策略模式
- 大话设计模式阅读笔记-策略模式
- 《大话设计模式》- 策略模式 - C++实现
- 大话设计模式C++实现--策略模式
- 大话设计模式--java实现策略模式
- 大话设计模式学习笔记(2)----策略模式
- 打磨&发展&投资
- 配置cucumber上Capybara使用selenium驱动
- 如果看了这篇文章你还不懂傅里叶变换,那就过来掐死我吧(二)
- c++中的explicit关键字
- html链接代码分析
- 大话设计模式笔记——策略模式(C++超市收银实现)
- Apache + Tomcat 配置多个应用
- fitnesse初学
- 如果看了这篇文章你还不懂傅里叶变换,那就过来掐死我吧(一)
- easyui机构树 满足选中节点需求
- 用GDB调试程序
- 男人就是累
- Dotnetnuke:EditURL与NavigateURL
- Linux Server流媒体配置过程