设计模式学习(二)————策略模式
来源:互联网 发布:js去重方法 编辑:程序博客网 时间:2024/06/02 00:33
在学习今天的设计模式之前,先要了解一个使用类的原则:
面向对象编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合集合才是类。
假如要实现一个商品价格收费的类,其中收费的策略有好几种,分别是普通金额,打折后金额,还有花费满一定金额返利。在类似实现这种情况的逻辑时,就可以使用策略模式!
策略模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不好影响到使用算法的客户
首先我们可以定义收费的基类,然后根据几种收费策略来进行继承:
#ifndef CASHSUPER#define CASHSUPERclass CashSuper{public: virtual ~CashSuper(){} virtual double acceptMoney(double money) = 0;};class CashNormal final:public CashSuper{//protected: double acceptMoney(double money) override { return money; }};class CashRebate final:public CashSuper{ double moneyRebate = 1;public: CashRebate(double rebate) { moneyRebate = rebate; }//protected: double acceptMoney(double money) override { return money*moneyRebate; }};class CashReturn final:public CashSuper{ double moneyCondition = 0; double moneyReturn = 0;public: CashReturn(double mc,double mr) { moneyCondition = mc; moneyReturn = mr; }//protected: double acceptMoney(double money) override { double result = money; if(money >= moneyCondition) result = money - (money/moneyCondition) * moneyReturn; return result; }};#endif // CASHSUPER
然后可以使用一个context类,将这些继承类封装起来然后在构造函数中实现继承类的挑选,界面逻辑所需要的结果也封装在这个context类中。
#ifndef CASHCONTEXT#define CASHCONTEXT#include <QString>#include "cashsuper.h"class CashContext //策略模式,以相同的方式调用各种算法,减少各种算法类和使用算法类的耦合,结果抽象在getResult函数里返回//同时策略模式还简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试!修改任意一个算法不会影响其他算法!!{ CashSuper * cs;public: CashContext(QString qs) //策略模式封装了变化,判断在策略类的函数里面完成,但是还有更好的方法:反射技术(抽象工厂模式中再学!) { if(qs == QString::fromUtf8("正常收费")) { cs = new CashNormal(); } else if(qs == QString::fromUtf8("打八折")) { cs = new CashRebate(0.8); } else if(qs == QString::fromUtf8("满300返100")) { cs = new CashReturn(300,100); } } double getResult(double money) { return cs->acceptMoney(money); }};#endif // CASHCONTEXT
这样,我们再简单做一个界面就看测试这个程序啦!界面程序请参考源代码。
最后方上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/shopPrice_strategy_pattern_2
0 0
- 设计模式学习(二)————策略模式
- 大话设计模式学习(二)——策略模式
- 二、策略模式——设计模式学习笔记
- 设计模式二——策略模式
- 设计模式—策略模式(二)
- 设计模式学习——策略模式
- 设计模式学习—策略模式
- 设计模式学习笔记—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- update-rc.d命令
- OC-向table中添加数据&table的编辑模式&通过封装自定义cell
- Android中的XML解析
- htc Vive中VR界面闪烁的解决
- 201609编程语言
- 设计模式学习(二)————策略模式
- Scala入门学习笔记四--List使用
- 自己搜集,整理的Handler见解
- bfs简单题----Knight Moves(hdu 1372)
- ROS Learning-029 (提高篇-007 A Mobile Base-05) 控制移动平台 --- (Python编程)控制虚拟机器人的移动(精确的制定目标位置)
- cell的高度自适应cell里lable的高度
- java 抽象类实现接口是什么设计模式
- source insight窗口恢复默认
- 13章 人机猜拳