1、策略模式:
它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
2、策略模式的结构图:

3、策略模式涉及到的角色:
抽象策略角色:(Strategy)策略类,由一个接口或者抽象类实现。
具体策略角色:(ConcreteStrategy)封装了相关的算法和行为的策略类的一个实现。
环境角色:(Context)持有一个策略类的引用,提供给客户端调用的(通过接口调用)。
4、实现代码如下:
4.1、抽象策略角色类:
1 2 3 4
| public interface Strategy {
public double calculate(double a,double b); }
|
4.2、具体策略角色类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class AddStrategy implements Strategy {
@Override public double calculate(double a, double b) { return a + b; } } public class SubStrategy implements Strategy {
@Override public double calculate(double a, double b) { return a - b; } }
|
4.3、环境角色类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class Context {
private Strategy strategy;
public Context(Strategy strategy){ this.strategy = strategy; }
public Strategy getStrategy() { return strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; }
public double calculate(double a, double b){ return strategy.calculate(a, b); } }
|
4.4、客户端调用:
1 2 3 4 5 6 7 8 9 10
| public static void main(String[] args) {
AddStrategy add = new AddStrategy(); Context context = new Context(add); System.out.println(context.calculate(1.2, 1.3));
SubStrategy sub = new SubStrategy(); context.setStrategy(sub); System.out.println(context.calculate(1.2, 1.3)); }
|
5、其他说明
提示: 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。 造成很多的策略类。 改进方法: 策略与工厂方法结合。 解决策略类过多带来的弊端,简化客户端的调用。