C++设计模式学习笔记:策略模式

  • 策略模式设计商场促销
    • 1、策略模式介绍
    • 2、商场收银系统策略模式实现
    • 3、策略模式与工厂模式结合
    • 3、策略模式与工厂模式对比

策略模式设计商场促销

1、策略模式介绍

策略模式: 它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

策略模式结构:

Strategy策略类,定义所有支持的算法的公共接口
ConcreteStrategy封装了具体的算法或行为,继承于Strategy。
Contxt,用一个ConcreteStrategy来配置,维护一个队Strategy对象的引用。

下面是C++代码 代码片.

//抽象算法类
class Strategy
{public:virtual void AlgorithmInterface() = 0;
}//具体实现算法
class ConcreateStrategyA:Strategy
{public:void AlgorithmInterface(){//算法A具体实现}
}
class ConcreateStrategyB:Strategy
{public:void AlgorithmInterface(){//算法B具体实现}
}
class ConcreateStrategyC:Strategy
{public:void AlgorithmInterface(){//算法C具体实现}
}
//上下文
class Context
{public:Context(Strategy strategy):Strategy(strategy){}//上下文接口void ContextInterface(){Strategy.AlgorithmInterface();}
private:Strategy strategy;
}//客户端代码
int main()
{Context context;context = new Context(new ConcreateStrategyA());context.ContextInterface();context = new Context(new ConcreateStrategyB());context.ContextInterface();context = new Context(new ConcreateStrategyC());context.ContextInterface();
}

2、商场收银系统策略模式实现

代码结构图:

下面是C++代码 代码片.

//抽象算法类
class CashSuper
{public:virtual double acceptCash(double money) = 0;
}//具体实现算法
class CashNormal:CashSuper
{public:void acceptCash(double money){return money}
}
class CashRebate:CashSuper
{public:CashRebate(double moneyRebate):moneyRebate(moneyRebate){}double acceptCash(double money){return money*moneyRebate;}
private:double moneyRebate =1;
}
class CashReturn:CashSuper
{public:CashReturn(double moneyCondition ,double moneyReturn):moneyCondition(moneyCondition),moneyReturn(moneyReturn){}double acceptCash(double money){double result = money;if(money >= moneyCondition){money = money - moneyReturn;}return money;}
private:double moneyCondition =0;double moneyReturn =0;
}//上下文
class CashContext
{public:CashContext(CashSuper csuper):cs(csuper){}//上下文接口double getResult(double money){return cs.acceptCash(money);}
private:CashSuper cs;
}//客户端代码
int main()
{CashContext cc = nullptr;string ss;double money;cin >> ss;cin >> money;swith(ss){case "正常收费":cc = new CashContext(new CashNormal);break;case "满300返100":cc = new CashContext(new CashReturn(300,100));break;case "打8折":cc = new CashContext(new CashReturn(0.8));break;}price = cc.getResult(money);}

3、策略模式与工厂模式结合

改造CashContext,改造后的C++代码实现:

class CashContext
{public:CashContext(CashSuper csuper):cs(string type){swith(type){case "正常收费":CashNormal cs0 = new CashNormal;cc = cs0;break;case "满300返100":CashNormal cs1 = new CashReturn(300,100);cc = cs1;break;case "打8折":CashNormal cs2 = new CashReturn(0.8);cc = cs2;break;}}//上下文接口double getResult(double money){return cs.acceptCash(money);}
private:CashSuper cs;
}

3、策略模式与工厂模式对比

客户端调用对比:

//简单工厂模式的用法
CashSuper csuper = CashFactory.createCashAccept(输入);
... = csuper.getResult(输入);
//策略模式与简单工厂结合的用法
CashSuper csuper = new CashContext(输入);
... = csuper.getResult(输入);

简单工厂客户端需要认识两个类,CashSuper和 CashFactory,而策略模式与简单工厂结合,客户端只需要认识一个类CashContxt就可以了,耦合更加降低。

总结:
策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

C++设计模式学习笔记:策略模式相关推荐

  1. [设计模式学习笔记] -- 策略模式

    策略模式 定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 举一个简单的例子来描述策略模式. 设计一款冷兵器时代士兵打仗的游戏,游戏内部设计要使用OO技术. ...

  2. Java-马士兵设计模式学习笔记-策略模式-模拟Comparable接口

    一.情况 1.目标:要在专门用于排序数据的DataSorter.java中实现对所有A类,B类,C类,D类等等的排序 2.初步想法:DataSorter.java的代码如下 public class ...

  3. 设计模式学习笔记——策略(Strategy)模式

    设计模式学习笔记--策略(Strategy)模式 @(设计模式)[设计模式, 策略模式, Stategy] 设计模式学习笔记策略Strategy模式 基本介绍 策略案例 类图 实现代码 Hand类 S ...

  4. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  5. 设计模式学习:策略模式

    策略模式简介 策略模式:策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现.策略模式最大的特点是行为的变化,行为之间可以相互替换.每个if判断都可以理解为就是 ...

  6. Head First设计模式读书笔记——策略模式

    问题描述: 目前的任务是实现一个FPS类游戏的各种角色(友军.敌军.平民和狗.猫.鸭子等动物)以及他们的各种行为(攻击.游泳等). 设计方案一 很简单,只要实现一个角色超类,将角色的各种行为放入超类中 ...

  7. 设计模式学习01策略模式记录

    (个人记录)策略模式带来的好处就是更加的有弹性,可以很方便的动态改变对象的行为,在已经固定的项目中如果要增加新的类型,在项目中我们要分析变化部分与不变部分. 将变化的部分(也就是策略算法)使用接口的方 ...

  8. 设计模式学习笔记——外观模式

    外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...

  9. 设计模式学习之策略模式(Strategy,行为型模式)(13)

    转载地址:http://www.cnblogs.com/zhili/p/StragetyPattern.html 一.引言 本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方 ...

  10. 设计模式学习笔记-原型模式

    一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象: 二.模式中的角色 Prototype:声明一个克隆自身的接口: ConcretePrototype:实现一个克隆自身的操作: ...

最新文章

  1. docker load 出错 open /var/lib/docker/tmp/docker-import-837327978/bin/json: no such file or directory
  2. Web 2.0背后的长尾理论
  3. linux环境 phpstudy集成环境中设置php永久环境变量
  4. visio画uml类图添加自定义数据类型
  5. 微型计算机和pc的概念,微型计算机IBM-PC(0520)系统原理及应用
  6. bcb异常处理显示错误行号_python基础篇:错误和异常
  7. JS面向对象的程序设计之创建对象_工厂模式,构造函数模式,原型模式-1
  8. Go 模块--开始使用Go Modules
  9. uniapp跨域两次请求解决方案
  10. 对va_list; va_start ; va_end ;vsprintf理解(转)
  11. Qt组态软件设计文章导航
  12. Python 最好用的8个VS Code扩展
  13. RT-Thread : IEEE1588/PTP 协议的实现
  14. 什么原因造成家里的WiFi网速慢?
  15. 神经调节的知识网络图,图神经网络与知识图谱
  16. 个人主页博客网页设计制作HTML5+CSS大作业——个人相册展示留言博客模板(6页) 简单个人网页制作
  17. 华北电力大学计算机科学,华北电力大学计算机科学与技术系介绍
  18. 使用OpenDaylight界面下发流表
  19. 软件工程:黄金G点小游戏1.0
  20. EKS集群手动升级kube-proxy组件

热门文章

  1. linux笔记:MOOC Linux开发环境及应用
  2. git初始化错误fatal: refusing to merge unrelated histories
  3. python百分号的作用_python里百分号什么意思
  4. C/C++ 程序自删除
  5. 第1194期机器学习日报(2017-12-25)
  6. Java学习日记Day26
  7. 01-lao-jQuery简介及版本下载安装
  8. 基于MVC4+EasyUI的Web开发框架经验总结(11)--使用Bundles处理简化页面代码
  9. 技术改变生活,激情成就梦想
  10. Ubuntu18.04 项目配置