策略模式定义了一系列的算法或者行为,并将每一个算法或行为封装起来,而且使他们可以互相替换,策略模式让行为独立于使用它的客户而独立变化
场景
- 针对同一个类型问题的多种处理方式,仅仅是具体行为有差别时
- 需要安全的封装多种同一类型的操作时
- 出现同一抽象类有多个子类,而又需要if-else或者switch-case来选择子类时
实现
- Context 操作策略的上下文环境
- Stragety 策略的抽象
- StragetyA、StragetyB具体的策略实现
Strategy.java
public interface Strategy {public int doOperation(int num1, int num2);}
创建实现接口的实体类。
OperationAdd.java
public class OperationAdd implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}}
OperationSubstract.java
public class OperationSubstract implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}}
OperationMultiply.java
public class OperationMultiply implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}}
创建 Context 类
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);}}
使用 Context 来查看当它改变策略 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));}}
优点
- 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为
- 策略模式提供了可以替换继承关系的办法
- 使用策略模式可以避免使用多重条件转移语句
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
- 策略模式将造成产生很多策略类
Android 中的应用
待补充
参考
技术文章:菜鸟教程-设计模式
