设计模式(四)【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设计模式(四) -- 模板方法模式
模板方法模式 定义 定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式.让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤 适用场景: 事务处理的步骤具有共性,只是具体实施,根据 ...
最新文章
- 算法工程师面试必考项——链表
- php使用webservivce_基于SSM框架实现简单的登录注册的示例代码
- CentOS安装和配置Mysql
- Excel:python结合Excel使用技巧经验总结之(将python输出的等间隔列数据直接粘贴复制存到物理表格内等)图文教程之详细攻略
- QT mouseMoveEvent事件(qmainwindow内追踪鼠标事件事件)
- 厉害了!Spring Boot 2.5正式发布
- NodeJS开源项目
- 聚焦索引与非聚焦索引及其查询效率 (MS SQL SERVER)
- HALCON示例程序IC.hdev通过电路板元器件定位识别
- JUC中的Atomic原子类
- 服务器pe系统u盘启动不了,U盘安装系统进不了PE怎么办?U盘装系统进不去pe如何解决?...
- Linux 打包压缩(tar、gzip、bzip、xz)备份(备份dump genisoimage 还原restore)
- 拯救者Y7000 2020新版Bios关闭开机自检
- UE4 虚幻引擎,光照系统。BP_Sky_Sphere 白天黑夜效果
- Chartboost ane sdk 使用教程
- python tokenize_model_python – 如何在数据框中使用word_tokenize
- 彩信发送和接收关键流程
- Cannot define dimension expressions when an array initializer is provided 错误
- SpringBoot发送邮件(二)发送包含图片的邮件
- 通过股票代码识别所属板块(20190730)
热门文章
- ssm+jsp计算机毕业设计中医馆药材信息管理系统6j0at(程序+lw+源码+远程部署)
- MySQL8报错:Public Key Retrieval is not allowed
- Arbitrum 的 Nitro 项目启动和交易执行源码解析
- 电脑开不了机 ,该怎么处理?
- 彩色图像增强之直方图均衡化
- yate学习--yateclass.h--class YATE_API NamedCounter : public String
- vijos P1009 清帝之惑之康熙
- 普里姆(Prim)算法(P算法):修路问题
- iOS动画一点也不神秘————你是喜欢看幻灯片?还是看高清电影?
- 中国增材制造中的贵金属市场趋势报告、技术动态创新及市场预测