策略模式

  • 定义:定义一系列的算法,把每一个算法封装起来,并且使他们可相互替换。策略模式使得算法可独立于使用它的客户而独立变化

 

  • 策略模式中有如下角色:
    • Context:上下文角色,用来操作策略的上下文环境,起到承上启下的作用,屏蔽高层模块对策略、算法的直接访问
    • Stragety:抽象策略角色,策略、算法的抽象,通常为接口
    • ConcreteStragety:具体的策略实现
  • 策略模式的简单实现
    • 定义策略接口
      public interface IStragety {
          int doOperation(int num1,int num2);
      }
      
    • 具体策略实现
      public class OperationAdd implements IStragety {
          @Override
          public int doOperation(int num1, int num2) {
              return num1+num2;
          }
      }
      
      public class OperationMinus implements IStragety {
          @Override
          public int doOperation(int num1, int num2) {
              return num1-num2;
          }
      }
      public class OpTimes implements IStragety {
          @Override
          public int doOperation(int num1, int num2) {
              return num1*num2;
          }
      }
      
    • 上下文角色
      public class Context {
          private IStragety stragety;
      
          public Context(IStragety stragety) {
              this.stragety = stragety;
          }
      
          public int operation(int num1, int num2){
              return stragety.doOperation(num1, num2);
          }
      }
      
    • 客户端调用
      public class ClientDemo {
          public static void main(String[] args){
              Context context = new Context(new OperationAdd());
              int sum = context.operation(3,4);
              int times = new Context(new OpTimes()).operation(4,5);
              System.out.println(String.format("Sum=%d,times=%d",sum,times));
          }
      }
      

 

  • 使用场景
    • 对客户隐藏策略算法的具体实现细节,彼此完全独立
    • 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时
    • 在一个类中定义了很多行为,而且这些行为在这个类里的操作以多个条件语句的形式出现。策略模式将相关的条件分支移入他们各自的Strategy类中,以代替这些条件语句
  • 优点
    • 使用策略模式可以避免使用多重条件语句。多重条件语句不易维护,而且易出错
    • 易于拓展。当需要添加一个策略算法时,只要实现接口就可以了
  • 缺点
    • 每一个策略都是一个类,复用性小。如果策略过多,类的数量会增多
    • 上层模块必须知道有哪些策略,才能使用这些策略,这与迪米特原则相违背

posted on 2018-06-06 15:52  endian11  阅读(122)  评论(0编辑  收藏  举报

导航