【设计模式】之策略模式
2012-05-28 03:58
218 查看
一、什么是策略模式
策略模式的目的是定义一系列算法,把它们封装起来,并且使它们可以相互替换。策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 策略模式的好处在于你可以动态的改变对象的行为。
二、设计模式的设计原则
设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++z中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。
三、设计模式的组成
策略模式中有三个对象:(1环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2抽象策略对象:它可由接口或抽象类来实现。
(3具体策略对象:它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。
四、设计模式的实例
(1)类之间的关系
(2)代码实现
步骤一:创建接口
package study_02.designpattern.strategy; public interface Strategy { public int doOperation(int num1, int num2); }
步骤二:创建具体的接口实现抽象策略对象
package study_02.designpattern.strategy; public class OperationAdd implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 + num2; } }
步骤三:创建具体的接口实现抽象策略对象
package study_02.designpattern.strategy; public class OperationSubstract implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 - num2; } }
步骤四:创建具体的接口实现抽象策略对象
package study_02.designpattern.strategy; public class OperationMultiply implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 * num2; } }
步骤五:创建环境对象
package study_02.designpattern.strategy; public class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public int executeStrategy(int num1, int num2){ return strategy.doOperation(num1, num2); } }
步骤五:应用实例
package study_02.designpattern.strategy; public class StrategyPatternDemo { public static void main(String[] args) { Context context = new Context(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationSubstract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); } }
步骤六:输出结果
10 + 5 = 1510 - 5 = 5
10 * 5 = 50
五、策略模式的缺点:
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类,这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。(2)策略模式造成许多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。
六、参考资料
http://www.tutorialspoint.com/design_pattern/strategy_pattern.htm相关文章推荐
- c++设计模式--策略模式
- Java设计模式透析之 —— 策略(Strategy)
- 再次回顾设计模式——策略模式
- php 设计模式-策略模式
- 从“假如有以下几种价格10,20,50,请你代码实现将他们排序输出”看设计模式中的策略模式
- opencv02-策略模式设计
- JAVA--策略模式(strategy)--设计模式十三
- JAVA设计模式-策略模式应用实例
- JAVA设计模式-策略模式应用实例
- 设计模式--策略模式
- 设计模式 状态模式 策略模式 观察者模式 命令模式 中介者模式
- 设计模式_02 策略模式
- Java设计模式-策略设计模式
- Java设计模式透析之 —— 策略(Strategy)
- java 设计模式 策略模式,comparable 接口,compareTo 方法
- 设计模式(十八)之 Strategy(策略)
- Java设计模式之策略模式与状态模式
- 设计模式实战(一)——使用策略模式(strategy pattern)实现多关键字排序
- (学习笔记)设计模式之策略模式
- 设计模式笔记——策略模式