9. 策略(Strategy)

Intent

定义一系列算法,封装每个算法,并使它们可以互换。

策略模式可以让算法独立于使用它的客户端。

Class Diagram

  • Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法。
  • Context 是使用到该算法族的类,其中的 doSomething() 方法会调用 behavior(),setStrategy(Strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。

与状态模式的比较

状态模式的类图和策略模式类似,并且都是能够动态改变对象的行为。但是状态模式是通过状态转移来改变 Context 所组合的 State 对象,而策略模式是通过 Context 本身的决策来改变组合的 Strategy 对象。所谓的状态转移,是指 Context 在运行过程中由于一些条件发生改变而使得 State 对象发生改变,注意必须要是在运行过程中。

状态模式主要是用来解决状态转移的问题,当状态发生转移了,那么 Context 对象就会改变它的行为;而策略模式主要是用来封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 Context 使用的算法。

Implementation

设计一个鸭子,它可以动态地改变叫声。这里的算法族是鸭子的叫声行为。

public interface QuackBehavior {void quack();
}
public class Quack implements QuackBehavior {@Overridepublic void quack() {System.out.println("quack!");}
}
public class Squeak implements QuackBehavior{@Overridepublic void quack() {System.out.println("squeak!");}
}
public class Duck {private QuackBehavior quackBehavior;public void performQuack() {if (quackBehavior != null) {quackBehavior.quack();}}public void setQuackBehavior(QuackBehavior quackBehavior) {this.quackBehavior = quackBehavior;}
}
public class Client {public static void main(String[] args) {Duck duck = new Duck();duck.setQuackBehavior(new Squeak());duck.performQuack();duck.setQuackBehavior(new Quack());duck.performQuack();}
}
squeak!
quack!

JDK

  • java.util.Comparator#compare()
  • javax.servlet.http.HttpServlet
  • javax.servlet.Filter#doFilter()

《一天聊一个设计模式》 策略相关推荐

  1. 《一天聊一个设计模式》 抽象工厂

    4. 抽象工厂(Abstract Factory) Intent 提供一个接口,用于创建 相关的对象家族 . Class Diagram 抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并 ...

  2. 《一天聊一个设计模式》备忘录

    备忘录(Memento) Intent 在不违反封装的情况下获得对象的内部状态,从而在需要时可以将对象恢复到最初状态. Class Diagram Originator:原始对象 Caretaker: ...

  3. 《一天聊一个设计模式》 单例

    我是兔兔rabbit,关注我吧,给自己每天的进步找一个机会和理由,不要被无效信息淹没 单例(Singleton) Intent 确保一个类只有一个实例,并提供该实例的全局访问点. Class Diag ...

  4. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

  5. JAVA设计模式-策略模式

    1.1 需求背景 Background:M公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下: (1)学生凭学生证可享受票价8折优惠: (2 ...

  6. 大话设计模式—策略模式

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 大话设计模式中程杰老师给出的定义是这样的:策略模式(Strategy),定义 ...

  7. 『设计模式』就因为多收了我2块5,我追着收银员问是不是不懂设计模式--策略模式

    23种设计模式+额外常用设计模式汇总 (持续更新) 今天去超市买东西,买了50多块钱的东西,然后收钱的时候他多收了,明明会员要打白金会员打9折,黄金会员95折,我是白金会员因该是9折. 我问她:&qu ...

  8. 关于设计模式——策略模式-Strategy Pattern

    文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...

  9. [设计模式] ------ 策略模式

    策略模式 它定义了算法家族,分别封装起来,让他们直接可以互相替换,此模式让算法的变化,不会影响到使用算法的客户 其实很简单,可能很多人都用到了,只不过还不知道这就是策略模式而已. 比如定义一个接口A, ...

最新文章

  1. Hdu5015 233 Matrix矩阵
  2. (60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程
  3. 强烈推荐10 个机器学习教程!(含视频链接)
  4. DCMTK:测试字符串OFString实用程序
  5. ios基础篇(二十六)—— UITableViewCell的分组索引与标记
  6. tensorflow量化感知训练_tensorflow模型量化实例
  7. Andrew Ng机器学习(一):线性回归
  8. 国内2大Git代码托管网站
  9. centos中mysql操作命令,Linux系统中MySQL的常用操作命令
  10. 乌龟量化估值怎么看_推荐几个查询指数估值的网址
  11. java 大型互联网架构_分享一些大型互联网架构常用的高端技术
  12. ThreadLocal 从源码角度简单分析
  13. apache make install 问题
  14. Oracle数据库练习题(3)
  15. 【vulhub漏洞复现】ActiveMQ 反序列化漏洞 (CVE-2015-5254)-01
  16. [Noi1999]钉子和小球
  17. python3多行输入字符串_python中怎么输入多行字符串
  18. SQL SERVER 2016 ctp3.3安装
  19. 全国行政分区明细表(省市区比较2010年左右)(第二部分)
  20. 盘点:计算机专业含金量最高的证书!只需一种证书在手,从此不愁

热门文章

  1. Linux Kbuild文档 3
  2. win10 iis网站服务器,windows10如何搭建IIS服务器
  3. java 登录编程_Java编程通过session访问需要登录的页面
  4. antd vue form 手动校验_参与《开课吧》vue训练营笔记(Day1)
  5. web——Tomcat Maven插件及Servlet入门
  6. springCloud五大组件--Gateway
  7. linux apache jk,Linux下Apache+Tomcat+JK实现负载均衡和群集的完整过程
  8. 【Python学习】 - 使用Anaconda的Spyder查看某些函数的原型的6种方法汇总
  9. 【牛客 - 82B】区间的连续段(贪心,建图,倍增)
  10. 【CF#148B】Escape(模拟)