常用设计者模式---策略模式
来源:互联网 发布:java内存溢出 编辑:程序博客网 时间:2024/05/21 21:42
1、目标
了解策略模式要解决的主要问题
举出常见的策略模式使用场景
说出JDK中运用策略模式的实例
2、什么是策略模式
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
简单的说,策略模式就是要应对规则变化和新规则加入对程序带来的影响。对于面向对象程序设计如何实现呢?通过接口可以避免直接调用规则,从而使得业务变化不会对规则产生影响。同时,添加新规则也不会影响业务流程。
3、策略模式结构
这个模式涉及到三个角色:
● 环境(Context)角色:持有一个Strategy的引用。
● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
源代码
环境角色类public class Context { //持有一个具体策略的对象 private Strategy strategy; /** * 构造函数,传入一个具体策略对象 * @param strategy 具体策略对象 */ public Context(Strategy strategy){ this.strategy = strategy; } /** * 策略方法 */ public void contextInterface(){ strategy.strategyInterface(); } }抽象策略类
public interface Strategy { /** * 策略方法 */ public void strategyInterface();}具体策略类
public class ConcreteStrategyA implements Strategy { @Override public void strategyInterface() { //相关的业务 }}
public class ConcreteStrategyB implements Strategy { @Override public void strategyInterface() { //相关的业务 }}
public class ConcreteStrategyC implements Strategy { @Override public void strategyInterface() { //相关的业务 }}
4、策略模式的优点和缺点
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。(3)提供了一种替代继承的方法,而且既保持了继承的优点(代码重用),还比继承更灵活(算法独立,可以任意扩展);
缺点:当实现算法较多时,会增加需要维护的类的数量。可以使用工厂方法来解决。(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
5、运用场景1、请说明策略模式符合哪些面向对象设计原则?
- 策略模式中,通过接口(interface)实现了业务与具体实现的隔离。所以,策略模式符合“面向接口,而不是面向实现”的编程原则。
- 在实现具体的策略(算法)时,通过实现接口可以方便地增加多个具体实现。所以,策略模式符合“开放封闭原则,对扩展开放,对修改封闭”。
- 业务代码(Context)只依赖规则接口(Strategy),不依赖具体实现。所以,策略模式符合“依赖倒置原则,高层(业务模块)不依赖底层模块(具体算法),只依赖抽象接口”。
- 排序工具类Collections中sort的基本实现:通过比较器comparator实现不同的对象比较策略。
- 正则表达式的Pattern实现:通过符合语法规则的正则表达式,以及匹配参数,实现不同的匹配策略。
- 线程池ThreadPoolExecutor实现:通过提供不同的排队策略和拒绝策略,在线程池ThreadPoolExecutor的管理中,提供不同的管理策略。
- ForkJoin框架的ForkJoinPool:通过提供并发任务线程池管理,对可分治解决的计算任务,开发者只需通过继承RecursiveAction或RecursiveTask即可实现不同的算法。
- 图形框架SWT Layout:对于需要实现多种不同布局的图形元素,通过Layout接口即可满足各种需求的布局策略。
相同点
1、 都是用到了封装、继承、多态;
2、 都抽出一个接口或者抽象类,针对不同的情况,有不同的实现类。
不同点
1、 使用方式不同,工厂是静态的,策略的上下文是需要创建对象的;
2、 工厂产生的是对象,不同情况下产生不同的对象;
3、 策略产生的是策略,或者说是算法,不同情况下使用不同的算法。
结论
无论何种设计模式,都是基于面相对象的三大特性,即封装、继承、多态。
用更直白的话来形容:
工厂模式:根据你给出的目的来生产不同用途的斧子,例如要砍人,那么工厂生产砍人斧子,要伐木就生产伐木斧子。
即根据你给出一些属性来生产不同行为的一类对象返回给你。
关注对象创建
策略模式:用工厂生产的斧子来做对应的事情,例如用砍人的斧子来砍人,用伐木的斧子来伐木。
即根据你给出对应的对象来执行对应的方法。
关注行为的选择
本文参考链接:http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html
http://www.importnew.com/12853.html
- 常用设计者模式---策略模式
- 常用设计者模式---观察者模式
- 常用设计者模式---命令模式
- 常用设计者模式---适配器模式
- 设计者模式
- 设计者模式
- 设计者模式
- 常用设计者模式---工厂模式和单例模式
- 常用设计者模式---门面模式(也叫外观模式)
- 常用设计者模式---装饰模式和桥接模式
- 设计者模式--观察者模式
- 设计者模式测试
- java-设计者模式
- 设计者模式-单例模式
- 常用设计模式——策略模式
- Android中的常用设计模式 --- 策略模式
- Android 常用设计模式之 -- 策略模式
- **** 读书计划 **** Javascript 设计者模式
- SQL语言基础
- linux中0号任务的创建以及堆栈初始化
- FansUnion:粉丝经济,已经称为主流
- [Linux]文件的atime ctime mtime
- Mac下修改hosts
- 常用设计者模式---策略模式
- 算法导论 红黑树 学习 删除(四)
- leetcode之AddTwoNumbers
- java中获取当前服务器的Ip地址的方法
- 09给定任意俩组字符串S1和S2,请编程输出他们间的最大相同子串
- qcacld-2.0的wlan分析之二
- Java 中的 File 类
- 欢迎使用CSDN-markdown编辑器
- web常用英语词汇