博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略模式
阅读量:6072 次
发布时间:2019-06-20

本文共 3109 字,大约阅读时间需要 10 分钟。

1】什么是策略模式?坊间的解释都比较拗口,而且不好理解。所谓策略模式,先构建一个策略(即子类的实例),再利用这个具体的实例构建一个策略对象,通过调用策略对象的接口可以达到相应具体策略的结果。【2】策略模式代码示例代码示例:/*  * 策略模式  */#include 
#include
#include
using namespace std;class CashSuper{public: virtual double acceptMoney(double money) = 0;};class CashNormal : public CashSuper{public: double acceptMoney(double money) { return money; }};class CashRebate : public CashSuper{private: double discount;public: CashRebate(double dis) { discount = dis; } double acceptMoney(double money) { return money * discount; }};class CashReturn : public CashSuper{private: double moneyCondition; double moneyReturn;public: CashReturn(double mc, double mr) { moneyCondition = mc; moneyReturn = mr; } double acceptMoney(double money) { double result = money; if (money >= moneyCondition) { result = money - floor(money / moneyCondition) * moneyReturn; } return result; }};class CashContext{private: CashSuper *cs;public: CashContext(CashSuper *cs) { this->cs = cs; } double getResult(double money) { return cs->acceptMoney(money); }};void main(){ CashSuper *cs; CashContext *cc; double money = 1000; cs = new CashRebate(0.8); cc = new CashContext(cs); cout << cc->getResult(money) << endl; money = 1000; cs = new CashNormal(); cc = new CashContext(cs); cout << cc->getResult(money) << endl;}
【3】策略与工厂结合模式代码示例/*  * 策略与工厂模式  */#include 
#include
#include
using namespace std;class CashSuper{public: virtual double acceptMoney(double money) = 0;};class CashNormal : public CashSuper{public: double acceptMoney(double money) { return money; }};class CashRebate : public CashSuper{private: double discount;public: CashRebate(double dis) { discount = dis; } double acceptMoney(double money) { return money * discount; }};class CashReturn : public CashSuper{private: double moneyCondition; double moneyReturn;public: CashReturn(double mc, double mr) { moneyCondition = mc; moneyReturn = mr; } double acceptMoney(double money) { double result = money; if (money >= moneyCondition) { result = money - floor(money / moneyCondition) * moneyReturn; } return result; }};class CashContext{private: CashSuper *cs;public: CashContext(string str) { if ("正常收费" == str) { cs = new CashNormal(); } else if ("打9折" == str) { cs = new CashRebate(0.9); } else if ("满300送200" == str) { cs = new CashReturn(300, 200); } } double getResult(double money) { return cs->acceptMoney(money); }};int main(){ double money = 1000; CashContext *cc = new CashContext("打9折"); cout << cc->getResult(money); return 0;}

http://www.cnblogs.com/Braveliu/p/3938368.html

你可能感兴趣的文章
单词统计
查看>>
输入一个数字计算圆的面积
查看>>
在Delphi中隐藏程序进程
查看>>
AngularJS PhoneCat代码分析
查看>>
maven错误解决:编码GBK的不可映射字符
查看>>
2016/4/19 反射
查看>>
SharePoint Wiki发布页面的“保存冲突”
查看>>
oracle 10g 数据库与客户端冲突导致实例创建无监听问题
查看>>
Delphi中读取文本文件的方法(实例一)
查看>>
Linux常用命令
查看>>
Android开源代码解读の使用TelephonyManager获取移动网络信息
查看>>
想说一点东西。。。。
查看>>
css知多少(8)——float上篇
查看>>
NLB网路负载均衡管理器详解
查看>>
水平添加滚动条
查看>>
PHP中”单例模式“实例讲解
查看>>
VS2008查看dll导出函数
查看>>
VM EBS R12迁移,启动APTier . AutoConfig错误
查看>>
atitit.细节决定成败的适合情形与缺点
查看>>
iOS - Library 库
查看>>