《一天聊一个设计模式》 策略
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()
《一天聊一个设计模式》 策略相关推荐
- 《一天聊一个设计模式》 抽象工厂
4. 抽象工厂(Abstract Factory) Intent 提供一个接口,用于创建 相关的对象家族 . Class Diagram 抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并 ...
- 《一天聊一个设计模式》备忘录
备忘录(Memento) Intent 在不违反封装的情况下获得对象的内部状态,从而在需要时可以将对象恢复到最初状态. Class Diagram Originator:原始对象 Caretaker: ...
- 《一天聊一个设计模式》 单例
我是兔兔rabbit,关注我吧,给自己每天的进步找一个机会和理由,不要被无效信息淹没 单例(Singleton) Intent 确保一个类只有一个实例,并提供该实例的全局访问点. Class Diag ...
- Python设计模式-策略模式
Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...
- JAVA设计模式-策略模式
1.1 需求背景 Background:M公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下: (1)学生凭学生证可享受票价8折优惠: (2 ...
- 大话设计模式—策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 大话设计模式中程杰老师给出的定义是这样的:策略模式(Strategy),定义 ...
- 『设计模式』就因为多收了我2块5,我追着收银员问是不是不懂设计模式--策略模式
23种设计模式+额外常用设计模式汇总 (持续更新) 今天去超市买东西,买了50多块钱的东西,然后收钱的时候他多收了,明明会员要打白金会员打9折,黄金会员95折,我是白金会员因该是9折. 我问她:&qu ...
- 关于设计模式——策略模式-Strategy Pattern
文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...
- [设计模式] ------ 策略模式
策略模式 它定义了算法家族,分别封装起来,让他们直接可以互相替换,此模式让算法的变化,不会影响到使用算法的客户 其实很简单,可能很多人都用到了,只不过还不知道这就是策略模式而已. 比如定义一个接口A, ...
最新文章
- Hdu5015 233 Matrix矩阵
- (60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程
- 强烈推荐10 个机器学习教程!(含视频链接)
- DCMTK:测试字符串OFString实用程序
- ios基础篇(二十六)—— UITableViewCell的分组索引与标记
- tensorflow量化感知训练_tensorflow模型量化实例
- Andrew Ng机器学习(一):线性回归
- 国内2大Git代码托管网站
- centos中mysql操作命令,Linux系统中MySQL的常用操作命令
- 乌龟量化估值怎么看_推荐几个查询指数估值的网址
- java 大型互联网架构_分享一些大型互联网架构常用的高端技术
- ThreadLocal 从源码角度简单分析
- apache make install 问题
- Oracle数据库练习题(3)
- 【vulhub漏洞复现】ActiveMQ 反序列化漏洞 (CVE-2015-5254)-01
- [Noi1999]钉子和小球
- python3多行输入字符串_python中怎么输入多行字符串
- SQL SERVER 2016 ctp3.3安装
- 全国行政分区明细表(省市区比较2010年左右)(第二部分)
- 盘点:计算机专业含金量最高的证书!只需一种证书在手,从此不愁
热门文章
- Linux Kbuild文档 3
- win10 iis网站服务器,windows10如何搭建IIS服务器
- java 登录编程_Java编程通过session访问需要登录的页面
- antd vue form 手动校验_参与《开课吧》vue训练营笔记(Day1)
- web——Tomcat Maven插件及Servlet入门
- springCloud五大组件--Gateway
- linux apache jk,Linux下Apache+Tomcat+JK实现负载均衡和群集的完整过程
- 【Python学习】 - 使用Anaconda的Spyder查看某些函数的原型的6种方法汇总
- 【牛客 - 82B】区间的连续段(贪心,建图,倍增)
- 【CF#148B】Escape(模拟)