(二)策略模式
来源:互联网 发布:白梦妍 知乎 编辑:程序博客网 时间:2024/05/01 12:57
请见源码和注释:
#include "stdafx.h"#include <string>#include <iostream>#include <memory>//为了应用智能指针using namespace std;//策略模式:定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化//不会影响到使用算法的客户。// 下面这个例子展示的是商场收银系统,为了支持某商品可以支持多种活动,采用策略模式。//CSaleStrategy:销售策略的抽象类,用来模拟策略的抽象类//CDiscountStrategy、CReturnStrategy和CNormalStrategy:不同销售策略,用来代表不同的策略。//CCashContext:支付类,包含策略指针,用来模拟用户可以直接使用的类(上层抽象层)。class CSaleStrategy{public: virtual ~CSaleStrategy(){} //获得最终的支付价格,需要输入单价和数量 virtual double GetResult(double dPrice, int iCount) = 0;};//打折处理class CDiscountStrategy : public CSaleStrategy{public: explicit CDiscountStrategy(double dDiscount) : m_dDiscount(dDiscount){} double GetResult(double dPrice, int iCount) { return dPrice * m_dDiscount * iCount;//打折后总价 }private: double m_dDiscount;//折扣};//满一定总价,返现class CReturnStrategy : public CSaleStrategy{public: explicit CReturnStrategy(double dLevel, double dRet) : m_dLevel(dLevel) , m_dRet(dRet) { } double GetResult(double dPrice, int iCount) { double dDeal = dPrice * iCount; if (dDeal >= m_dLevel) { dDeal -= m_dRet; } return dDeal; }private: double m_dLevel;//返现的最低消费 double m_dRet; //返现值};//按定价正常销售class CNormalStrategy : public CSaleStrategy{public: double GetResult(double dPrice, int iCount) { return dPrice * iCount; }};//收银类class CCashContext{private: unique_ptr<CSaleStrategy> m_pStrag;//包含关系来实现策略内置public: //根据活动类型(strStragType)来确定支付策略(与工厂模式相结合) CCashContext(const string &strStragType) : m_pStrag(nullptr) { if ("正常收费" == strStragType) { m_pStrag = unique_ptr<CNormalStrategy>(new CNormalStrategy); } else if ("满300返100" == strStragType) { m_pStrag = unique_ptr<CReturnStrategy>(new CReturnStrategy(300, 100)); } else if ("打8折" == strStragType) { m_pStrag = unique_ptr<CDiscountStrategy>(new CDiscountStrategy(0.8)); } else { m_pStrag = nullptr; } } double GetResult(double dPrice, int iCount) { return m_pStrag->GetResult(dPrice, iCount);//根据具体的策略来调用 }};int _tmain(int argc, _TCHAR* argv[]){ CCashContext cxt("打8折"); cout << cxt.GetResult(100, 1) << endl; CCashContext cxt2("满300返100"); cout << cxt2.GetResult(100, 3) << endl;return 0;}
输出:
80
200
请按任意键继续. . .
0 0
- (二)策略模式
- (二)策略模式
- (二)策略模式
- 二、策略模式(策略工厂)
- 二、策略模式(Strategy)
- 初学设计模式二(策略模式)
- 设计模式心得(二) 策略模式
- 设计模式(二):策略模式
- 设计模式(二)策略模式
- 设计模式(二)--策略模式
- 设计模式(二)策略模式
- 设计模式(二十二) 策略模式
- 设计模式—策略模式(二)
- 设计模式(二):策略模式
- 策略(Strategy)模式 (二)
- 二 策略模式
- 二、策略模式
- 设计模式笔记(二)--策略模式、观察者模式
- LeetCode_OJ【17】Letter Combinations of a Phone Number
- maven项目将自定义文件添加到META-INF中
- CCNA学习指南 数据中心(640-911)——互动出版网
- noip2006 2^k进制数 (组合数学)
- MTK 时间 时区问题解决方案
- (二)策略模式
- MapReduce(一):入门级程序wordcount及其分析
- MongoDB性能篇 -创建索引,组合索引,唯一索引,删除索引和explain执行计划
- Android PackageManager 用法
- GTK+浅谈之六自由布局并移动控件位置
- linux文件系统inode与软链接硬链接
- 自绘控件的4种方法
- 图标收集
- Error:Execution failed for task ':app:dexDebug'.