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模式】相关推荐

  1. 实验一:行为型设计模式之Strategy模式

    实验一:行为型设计模式之Strategy模式 https://blog.csdn.net/weixin_43206161 一.实验目的 熟练使用JAVA实现行为型设计模式-策略模式,理解设计模式的模式 ...

  2. 乱砍设计模式之一 -- STRATEGY模式

    STRATEGY模式---赵子龙单骑救主 junguo STRATEGY在中文中被译成了策略,我感觉这个意思并不妥切,但翻英文词典能得到的翻译也只有这个,我的词典比较简单,不知道是否还有其它意思?如果 ...

  3. 设计模式--策略(Strategy)模式

    模式定义 定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化),该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化) 类图 要点总结 Strategy及其子类为组件提供了 ...

  4. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式- Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  5. 乱砍设计模式之一 -- STRATEGY 模式

    转自 : http://www.vckbase.com/document/viewdoc/?id=1633 STRATEGY在中文中被译成了策略,我感觉这个意思并不妥切,但翻英文词典能得到的翻译也只有 ...

  6. 设计模式之strategy模式(C++实现)

    策略模式是一种比较常用的设计模式,他主要体现在对象可以有某个行为,但是在不同的场景时用不同的实现方法! 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不 ...

  7. 设计模式(四)——工厂模式(Factory Pattern)

    工厂模式(Factory Pattern) 意义 工厂模式 实现了创建者和调用者的分离.将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性 ...

  8. JS 设计模式四 -- 模块模式

    概念 模块模式的思路 就是 就是单例模式添加私有属性和私有方法,减少全局变量的使用. 简单的代码结构: var singleMode = (function(){// 创建私有变量var privat ...

  9. Python设计模式(四) -- 模板方法模式

    模板方法模式 定义 定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式.让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤 适用场景: 事务处理的步骤具有共性,只是具体实施,根据 ...

最新文章

  1. 算法工程师面试必考项——链表
  2. php使用webservivce_基于SSM框架实现简单的登录注册的示例代码
  3. CentOS安装和配置Mysql
  4. Excel:python结合Excel使用技巧经验总结之(将python输出的等间隔列数据直接粘贴复制存到物理表格内等)图文教程之详细攻略
  5. QT mouseMoveEvent事件(qmainwindow内追踪鼠标事件事件)
  6. 厉害了!Spring Boot 2.5正式发布
  7. NodeJS开源项目
  8. 聚焦索引与非聚焦索引及其查询效率 (MS SQL SERVER)
  9. HALCON示例程序IC.hdev通过电路板元器件定位识别
  10. JUC中的Atomic原子类
  11. 服务器pe系统u盘启动不了,U盘安装系统进不了PE怎么办?U盘装系统进不去pe如何解决?...
  12. Linux 打包压缩(tar、gzip、bzip、xz)备份(备份dump genisoimage 还原restore)
  13. 拯救者Y7000 2020新版Bios关闭开机自检
  14. UE4 虚幻引擎,光照系统。BP_Sky_Sphere 白天黑夜效果
  15. Chartboost ane sdk 使用教程
  16. python tokenize_model_python – 如何在数据框中使用word_tokenize
  17. 彩信发送和接收关键流程
  18. Cannot define dimension expressions when an array initializer is provided 错误
  19. SpringBoot发送邮件(二)发送包含图片的邮件
  20. 通过股票代码识别所属板块(20190730)

热门文章

  1. ssm+jsp计算机毕业设计中医馆药材信息管理系统6j0at(程序+lw+源码+远程部署)
  2. MySQL8报错:Public Key Retrieval is not allowed
  3. Arbitrum 的 Nitro 项目启动和交易执行源码解析
  4. 电脑开不了机 ,该怎么处理?
  5. 彩色图像增强之直方图均衡化
  6. yate学习--yateclass.h--class YATE_API NamedCounter : public String
  7. vijos P1009 清帝之惑之康熙
  8. 普里姆(Prim)算法(P算法):修路问题
  9. iOS动画一点也不神秘————你是喜欢看幻灯片?还是看高清电影?
  10. 中国增材制造中的贵金属市场趋势报告、技术动态创新及市场预测