策略模式定义了一系列的算法或者行为,并将每一个算法或行为封装起来,而且使他们可以互相替换,策略模式让行为独立于使用它的客户而独立变化

场景

  • 针对同一个类型问题的多种处理方式,仅仅是具体行为有差别时
  • 需要安全的封装多种同一类型的操作时
  • 出现同一抽象类有多个子类,而又需要if-else或者switch-case来选择子类时

实现

  • Context 操作策略的上下文环境
  • Stragety 策略的抽象
  • StragetyA、StragetyB具体的策略实现

Strategy.java

  1. public interface Strategy {
  2. public int doOperation(int num1, int num2);
  3. }

创建实现接口的实体类。
OperationAdd.java

  1. public class OperationAdd implements Strategy{
  2. @Override
  3. public int doOperation(int num1, int num2) {
  4. return num1 + num2;
  5. }
  6. }

OperationSubstract.java

  1. public class OperationSubstract implements Strategy{
  2. @Override
  3. public int doOperation(int num1, int num2) {
  4. return num1 - num2;
  5. }
  6. }

OperationMultiply.java

  1. public class OperationMultiply implements Strategy{
  2. @Override
  3. public int doOperation(int num1, int num2) {
  4. return num1 * num2;
  5. }
  6. }

创建 Context 类

  1. public class Context {
  2. private Strategy strategy;
  3. public Context(Strategy strategy){
  4. this.strategy = strategy;
  5. }
  6. public int executeStrategy(int num1, int num2){
  7. return strategy.doOperation(num1, num2);
  8. }
  9. }

使用 Context 来查看当它改变策略 Strategy 时的行为变化。

  1. public class StrategyPatternDemo {
  2. public static void main(String[] args) {
  3. Context context = new Context(new OperationAdd());
  4. System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
  5. context = new Context(new OperationSubstract());
  6. System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
  7. context = new Context(new OperationMultiply());
  8. System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
  9. }
  10. }

优点

  • 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为
  • 策略模式提供了可以替换继承关系的办法
  • 使用策略模式可以避免使用多重条件转移语句

缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
  • 策略模式将造成产生很多策略类

Android 中的应用

待补充

参考

技术文章:菜鸟教程-设计模式