策略模式——可以在运行时由客户端自行决定使用何种策略,实现相同行为的不同实现。
结构:
- 策略接口:相同行为的统一入口
- 具体策略:均实现了策略接口,且有不同的策略实现
- context类:对策略进行二次封装,并调用策略,避免高层模块直接调用策略
- client类:根据context对象来查看不同的策略产生的结果
优点:
- 策略类之间自由方便的切换
- 易于扩展,不改变原有代码,直接增加策略即可
- 避免使用多重条件,便于维护
缺点:
- 客户端必须知道所有的策略类,以及策略之间的区别
- 在策略变多时,可能会导致对象过多而臃肿
具体代码(转自菜鸟教程,侵删):
实现
我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。
StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。
步骤 1
创建一个接口。
Strategy.java
public interface Strategy { public int doOperation(int num1, int num2); }
步骤 2
创建实现接口的实体类。
OperationAdd.java
public class OperationAdd implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 + num2; } }
OperationSubstract.java
public class OperationSubstract implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 - num2; } }
OperationMultiply.java
public class OperationMultiply implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 * num2; } }
步骤 3
创建 Context 类。
Context.java
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); } }
步骤 4
使用 Context 来查看当它改变策略 Strategy 时的行为变化。
StrategyPatternDemo.java
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)); } }
步骤 5
执行程序,输出结果:
10 + 5 = 15 10 - 5 = 5 10 * 5 = 50