设计模式(四)【Strategy模式】
Strategy模式
《设计模式》中的三个原则:
1、针对接口编程而不是实现
2、优先使用对象组合而不是类继承
3、考虑设计中哪些是可变的,对变化的概念进行封装。
例:国际电子商务系统案列研究
1、最初需求
系统处理来自不同国家的订单。总框架中有一个控制器TaskController对象,处理销售请求时,将请求转发给SalesOrder对象进行处理。
SalesOrder对象的功能包括:
1、允许顾客通过GUI填写订单;
2、处理税额计算;
3、处理订单,打印销售收据
有些功能要借助其他对象实现。比如SalesOrder对象没有必要自己打印,它的作用是充当一个存放销售订单的容器。具体的SalesOrder对象可以调用SalesTicket对象来打印。
2、处理新需求
需要修改处理税额的方法。比如处理美国以外的客户的订单税额。
一般来说处理概念相同但不同实现的任务有哪些方案?
- 复制粘贴【×,不利于修改和debug】
- switch和if【×,条件或情况太多则不适用】
- 函数指针或委托【×,C++中的函数指针和C#的委托,但是无法维持每个对象的状态,使用受限】
- 继承(子类用新的方式处理)【×,太深的继承层次导致多概念耦合(这里的继承指直接把包含需要改变的功能的类整个使用继承)】
- 将整个功能委托给新的对象
遵循开头列出的三个原则,应该这样做:
1、寻找变化,并将它封装到一个单独的类中
2、将这个类包含在另一个类中
创建CalcTax对象,为完成税额计算定义接口,由它派生所需的特定版本。
此处我把原书上的代码按自己的理解微调了一下。
public class TaskController{private CalcTax myTax;//根据用户GUI填写信息设置myTax到底是USTax还是CanTax,如果这个参数是直接和SalesOrder打交道的话,直接转到SalesOrder里即可。private SalesOrder so;public void process(){so.calcTax(myTax,itemSold,qty,price);//信息都由GUI得到}
}
public class SalseOrder{pubic double calcTax(CalcTax myTax,Salable itemSold, int qty, double price){myTax.taxAmount(itemSold, qty, price);
}public abstract class CalcTax{abstract public double taxAmount(Salable itemSold, int qty, double price);
}
public class CanTax extends CalcTax{public double taxAmount(Salable itemSold, int qty, double price){//some code}
}
public class USTax extends CalcTax{public double taxAmount(Salable itemSold, int qty, double price)//some code}
这样我们就不必要用继承实现SalesOrder的多态,而只要实现变化部分的多态。
Strategy模式
定义一系列的算法,把它们一个个封装起来,并且使它们可互相替换,Strategy模式使算法可独立于使用它的客户而变化。
Strategy模式以下列几条原则为基础:
1、对象具有职责
2、职责的不同实现是通过多态完成的
3、概念上相同的算法不同的实现,需要进行管理
Strategy模式 | 关键特征 |
---|---|
意图 | 可以根据上下文使用不同的业务规则或算法 |
问题 | 对于所需的算法取决于发请求的用户或者要处理的数据。如果是固定不变的算法就不需要使用 |
解决方案 | 对于算法的选择和算法的实现相分离。允许根据上下文进行选择。 |
参与者与协作者 |
1、Strategy指定了如何使用不同的算法 2、各ConcreteStrategy实现了这些不同的算法 3、Context通过类型为Strategy的引用使用具体的ConcreteStrategy。Strategy与Context(可以看做获得GUI的数据)相互作用以实现所需算法。Context将来自用户的请求转发给Strategy。 |
效果 |
1、Strategy模式定义了一系列的算法 2、可以不使用switch和if 3、必须以相同的方式调用所有算法(多态) |
实现 | 让使用算法的类包含一个抽象类,抽象类有一个抽象方法指定如何调用算法,子类按需求实现具体算法。 |
参考《设计模式解析》第二版
设计模式(四)【Strategy模式】相关推荐
- 实验一:行为型设计模式之Strategy模式
实验一:行为型设计模式之Strategy模式 https://blog.csdn.net/weixin_43206161 一.实验目的 熟练使用JAVA实现行为型设计模式-策略模式,理解设计模式的模式 ...
- 乱砍设计模式之一 -- STRATEGY模式
STRATEGY模式---赵子龙单骑救主 junguo STRATEGY在中文中被译成了策略,我感觉这个意思并不妥切,但翻英文词典能得到的翻译也只有这个,我的词典比较简单,不知道是否还有其它意思?如果 ...
- 设计模式--策略(Strategy)模式
模式定义 定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化),该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化) 类图 要点总结 Strategy及其子类为组件提供了 ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式- Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 乱砍设计模式之一 -- STRATEGY 模式
转自 : http://www.vckbase.com/document/viewdoc/?id=1633 STRATEGY在中文中被译成了策略,我感觉这个意思并不妥切,但翻英文词典能得到的翻译也只有 ...
- 设计模式之strategy模式(C++实现)
策略模式是一种比较常用的设计模式,他主要体现在对象可以有某个行为,但是在不同的场景时用不同的实现方法! 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不 ...
- 设计模式(四)——工厂模式(Factory Pattern)
工厂模式(Factory Pattern) 意义 工厂模式 实现了创建者和调用者的分离.将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性 ...
- JS 设计模式四 -- 模块模式
概念 模块模式的思路 就是 就是单例模式添加私有属性和私有方法,减少全局变量的使用. 简单的代码结构: var singleMode = (function(){// 创建私有变量var privat ...
- Python设计模式(四) -- 模板方法模式
模板方法模式 定义 定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式.让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤 适用场景: 事务处理的步骤具有共性,只是具体实施,根据 ...
最新文章
- 理解和配置Out of memory: Kill process
- 用master-worker模型比对团队管理
- python中常用的语句元素
- 融合通信常见问题3月刊 | 云信小课堂
- 7 win 卸载node_node怎么卸载?Windows卸载node方法
- 电脑机器人_【头条】厚积薄发!卡达电脑智能机器人之纸箱码垛机赋能智能工厂...
- microsoft账号登陆一直在加载_英雄联盟手游下载,附带拳头账号注册教程
- Oracle 最后通牒:要 Java 8 更新先交钱!
- AR:Unity与iOS交互(入门篇)
- AS技巧合集「编码技巧篇」
- 返回两个时间范围内的一个随机时间
- flexray VPX控制板设计方案详细
- mysql 钩子_SetWindowsHookEx原理(如何使用钩子,使用钩子hook其他进程的函数)
- CDA备考学习学习笔记——基础知识篇(一)
- Kindle下载字典
- 如何在word中输入带方框的对钩
- 点序AS2258量产详尽图文教程以及量产工具固件下载,保姆级教程
- docker run 报错 Bind for 0.0.0.0:80 failed: port is already allocated.解决方案
- 想不想修真鸿蒙秘术,想不想修真鸿蒙秘诀怎么得 揭开想不想修真秘诀真面目...
- 计算机管理员和用户名区别,Administrator记不住?教你自定义管理员账户名称