chvnetcom 2011-05-01
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.) Context(应用场景): 1、需要使用ConcreteStrategy提供的算法。
2、内部维护一个Strategy的实例。
3、负责动态设置运行时Strategy具体的实现算法。
4、负责跟Strategy之间的交互和数据传递。
Strategy(抽象策略类):
1、定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
ConcreteStrategy(具体策略类):
2、 实现了Strategy定义的接口,提供具体的算法实现。
应用场景:
1、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。(例如FlyBehavior和QuackBehavior)
2、需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。(例如FlyBehavior和QuackBehavior的具体实现可任意变化或扩充)
3、 对客户(Duck)隐藏具体策略(算法)的实现细节,彼此完全独立。
UML图示:
策略模式的实现
–策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
–策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。
–环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端策略模式的编写步骤
–1.对策略对象定义一个公共接口。
–2.编写策略类,该类实现了上面的公共接口
–3.在使用策略对象的类中保存一个对策略对象的引用。
–4.在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值•策略模式的缺点
–1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
–2.造成很多的策略类。•解决方案–采用工厂方法
测试:演示两个数的加、减、乘、除运算
一:
建立一个策略的接口
package collection2; public interface Strategy { public int calculate(int a,int b); }
二:
实现一组策略的方法类
package collection2; public class AddStrategy implements Strategy { public int calculate(int a, int b) { return a + b; } } package collection2; public class SubtractStrategy implements Strategy { public int calculate(int a, int b) { return a - b; } } package collection2; public class MultiplyStrategy implements Strategy { public int calculate(int a, int b) { return a * b; } } package collection2; public class DivideStrategy implements Strategy { public int calculate(int a, int b) { return a / b; } }
三:
定义一个策略对象类,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值
package collection2; public class Environment { private Strategy strategy; public Environment(Strategy strategy) { this.setStrategy(strategy); } public void setStrategy(Strategy strategy) { this.strategy = strategy; } public Strategy getStrategy() { return strategy; } public int calculate(int a, int b) { return strategy.calculate(a, b); } }
四:
构建一个策略的客服端类,对我们上面定义的策略模式进行测试
package collection2; public class Client { public static void main(String[] args) { AddStrategy addStrategy = new AddStrategy(); // 加法策略 Environment environment = new Environment(addStrategy); System.out.println("加法策略" + environment.calculate(8, 2)); // 减法策略 SubtractStrategy subtractStrategy = new SubtractStrategy(); environment.setStrategy(subtractStrategy); System.out.println("减法策略:" + environment.calculate(8, 2)); // 乘法策略 MultiplyStrategy multiplyStrategy = new MultiplyStrategy(); environment.setStrategy(multiplyStrategy); System.out.println("乘法策略:" + environment.calculate(8, 2)); // 除法策略 DivideStrategy divideStrategy = new DivideStrategy(); environment.setStrategy(divideStrategy); System.out.println("除法策略:" + environment.calculate(8, 2)); } }
测试结果:
加法策略10
减法策略:6
乘法策略:16
除法策略:4