【设计模式】2.Strategy 策略模式
Strategy 策略模式
动机(Motivation)
- 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担(许多ifelse不被使用,占用缓存位置等等)。
- 如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?
模式定义
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(支持变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。
——《设计模式》 GoF
=个人理解 抽象类靠向开闭=
要点总结
Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时(运行时传递多态对象,运行时执行多态调用),方便地根据需要在各个算法之间进行切换。
Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。(Singleton?)
- 如果代码里出现大量if else/switch case 可能就是策略模式需要出现的特征。
以拓展的方式,支持未来的变化。 - 但if else在绝对不变的情况下,不需要用策略模式。例如根据性别判断。
结构
红稳定 蓝不稳
例子
改之前
enum TaxBase {CN_Tax,US_Tax,DE_Tax,FR_Tax //更改,违反开闭
};class SalesOrder{TaxBase tax;
public:double CalculateTax(){//...if (tax == CN_Tax){//CN***********}else if (tax == US_Tax){//US***********}else if (tax == DE_Tax){//DE***********}else if (tax == FR_Tax){ //更改 // 这样修改也并不算是一种真正的复用,真正的复用是 编译单位 二进制的复用。// 这是源代码片段级的复用,这是拷贝粘贴//...}//....}};
策略模式
class TaxStrategy{public:virtual double Calculate(const Context& context)=0;virtual ~TaxStrategy(){}
};class CNTax : public TaxStrategy{public:virtual double Calculate(const Context& context){//***********}
};class USTax : public TaxStrategy{public:virtual double Calculate(const Context& context){//***********}
};class DETax : public TaxStrategy{public:virtual double Calculate(const Context& context){//***********}
};//扩展
//*********************************
class FRTax : public TaxStrategy{public:virtual double Calculate(const Context& context){//.........}
};class SalesOrder{private:TaxStrategy* strategy;public:// 工厂模式 返回堆对象,后面讲SalesOrder(StrategyFactory* strategyFactory){this->strategy = strategyFactory->NewStrategy();}~SalesOrder(){delete this->strategy;}public double CalculateTax(){//...Context context();double val = strategy->Calculate(context); //多态调用//...}};
【设计模式】2.Strategy 策略模式相关推荐
- 设计模式之Strategy策略模式
文章目录 前言 一.Strategy策略模式 二.策略模式原则 三.使用场景 1.先做比较练习 2.为一组对象排序 3.使用Lambda表达式的方式 前言 本人对于设计模式的学习,仅供参考! 一.St ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- Java的设计模式----strategy(策略模式)
设计模式: 一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精 ...
- 设计模式——Strategy(策略)模式
目录 前言 1 定义 2 适用性 3 结构 3.1 结构图 3.2 参与者 4 实际应用举例 4.1 Context--List列表和StuContext 4.2 具体策略:ConcreteStrat ...
- [设计模式] —— Strategy 策略模式
文章目录 Strategy 策略模式 动机 定义 示例代码 结构图 总结 Strategy 策略模式 组件协作模式通过晚绑定,来实现框架与应用程序之间的松耦合.是框架和引用程序协作常用的. 动机 某些 ...
- JAVA中的设计模式三(策略模式)
问题: 如何让算法和对象分开来,使得算法可以独立于使用它的客户而变化? 方案: 把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以 ...
- 设计模式入门(策略模式)
[0]README 0.1)本文部分文字描述转自 "head first 设计模式",旨在学习 设计模式入门(策略模式) 的基础知识: 0.2)本文章节4和5的source cod ...
- 读书 | 设计模式之禅 - 策略模式
文章目录 1. 引入策略模式 2. 策略模式定义 3. 策略模式的优点 1. 引入策略模式 智谋无敌的诸葛亮,在刘备去东吴招亲之前,特授以伴郎赵云三个锦囊,说是按天机拆开解决棘手问题. 这三个妙计分别 ...
- 设计模式学习笔记--Strategy 策略模式
所谓策略模式(Strategy Pattern),就是将策略 (算法) 封装为一个对象,易于相互替换,如同 USB 设备一样可即插即用:如果将策略.具体的算法和行为,编码在某个类或客户程序内部,将导至 ...
最新文章
- Python中由生成杨辉三角代码所思考的一些问题
- mysql 硬盘写入速度_MySQL存储写入速度慢分析
- Explain:解决MUI 软键盘弹起挤压页面问题
- php对应哪个oracle版本,Oracle 版本说明
- Docker学习笔记_安装和使用Apache
- IDEA下svn配置与share project
- Java中的类型推断和lambda表达式
- 代码调用NullPointerException(NPE)
- Android+微信 弹出层无法滚动?
- 玩游戏用固态硬盘还是机械硬盘
- html 怎么几秒后自动隐藏,js设定DIV显示时间并动态显示时间倒计时多少秒,倒计时完了之后该层自动隐藏。...
- 虚幻4 ai蓝图_高效AI自我监督学习的迷人蓝图
- 计算机软考高级论文怎么写,【干货】软考高级论文怎么写易得高分?
- 三村合建水厂问题研究 (代码)
- docker-nividia run 报错
- C++实现小写转大写
- [转] 当猫爱上蝴蝶
- iOS开发脚踏实地学习day14-绘图
- 图片加密(一)颜色加密
- python共享文件协同编辑_那些可多人协作编辑的在线文档工具