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. 理解和配置Out of memory: Kill process
  2. 用master-worker模型比对团队管理
  3. python中常用的语句元素
  4. 融合通信常见问题3月刊 | 云信小课堂
  5. 7 win 卸载node_node怎么卸载?Windows卸载node方法
  6. 电脑机器人_【头条】厚积薄发!卡达电脑智能机器人之纸箱码垛机赋能智能工厂...
  7. microsoft账号登陆一直在加载_英雄联盟手游下载,附带拳头账号注册教程
  8. Oracle 最后通牒:要 Java 8 更新先交钱!
  9. AR:Unity与iOS交互(入门篇)
  10. AS技巧合集「编码技巧篇」
  11. 返回两个时间范围内的一个随机时间
  12. flexray VPX控制板设计方案详细
  13. mysql 钩子_SetWindowsHookEx原理(如何使用钩子,使用钩子hook其他进程的函数)
  14. CDA备考学习学习笔记——基础知识篇(一)
  15. Kindle下载字典
  16. 如何在word中输入带方框的对钩
  17. 点序AS2258量产详尽图文教程以及量产工具固件下载,保姆级教程
  18. docker run 报错 Bind for 0.0.0.0:80 failed: port is already allocated.解决方案
  19. 想不想修真鸿蒙秘术,想不想修真鸿蒙秘诀怎么得 揭开想不想修真秘诀真面目...
  20. 计算机管理员和用户名区别,Administrator记不住?教你自定义管理员账户名称

热门文章

  1. 算法导论第九章习题9.2-3
  2. 【DB笔试面试592】在Oracle中,表和表之间的关联方式有哪几种?
  3. VC2010软件界面设计UIDemo
  4. CTF常见密码编码合集
  5. 安卓期末作品小项目_创意编程作品赞美!
  6. Linux笔记(五)之组管理和权限管理
  7. Unifier培训: 系列讲解16: 公司级的BP--项目的立项申请
  8. linux bonding 原理,Linux bonding 之balance-alb 原理介绍及其实现
  9. 老电脑怎么重装系统win10
  10. Solr环境搭建,下载和安装