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接口即可满足各种需求的布局策略。
用更直白的话来形容:
工厂模式:根据你给出的目的来生产不同用途的斧子,例如要砍人,那么工厂生产砍人斧子,要伐木就生产伐木斧子。
即根据你给出一些属性来生产不同行为的一类对象返回给你。
关注对象创建
策略模式:用工厂生产的斧子来做对应的事情,例如用砍人的斧子来砍人,用伐木的斧子来伐木。
即根据你给出对应的对象来执行对应的方法。
关注行为的选择
本文参考链接:http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html
http://www.importnew.com/12853.html