设计模式 - 浅谈策略模式

策略模式

模式功能说明:它使你能在运行时改变对象的行为。

模式思路与原理

策略模式中,我们创建对象,它们表示各种策略,并且一个上下文对象,它的行为根据其策略对象的行为而变化。策略对象改变上下文对象的执行算法。

代码示例

interface Strategy {
   public int doOperation(int num1, int num2);
}

class OperationAdd implements Strategy {
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}

class OperationSubstract implements Strategy {
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}

class Context {
   private Strategy strategy;

   public Context(Strategy strategy){
      this.strategy = strategy;
   }

   public int executeStrategy(int num1, int num2){
      return strategy.doOperation(num1, num2);
   }
}

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));
   }
}

我们定义了一个策略接口Strategy和两个实现了该接口的具体策略类OperationAddOperationSubstract。然后我们定义了一个上下文类Context,它使用了策略接口,根据具体的策略对象来调用其算法的方法。在main方法中,我们创建了Context对象,并分别设置了不同的策略对象,然后调用executeStrategy方法,可以看到不同的策略对象会导致Context的行为发生改变。

使用场景:

  • 一个系统有许多许多类,而区分它们的只是他们直接的行为策略。
  • 一个系统需要动态地在几种算法中选择一种。

优缺点

优点

  1. 可以清晰地定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。
  2. 算法可以自由切换。
  3. 避免使用多重条件判断。
  4. 提高算法的保密性和安全性。

缺点

  1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  2. 会产生很多策略类。

总结

策略模式使用了设计原则有:组合/聚合复用(优先使用组合或聚合关系来实现对象之间的复用)和单一职责原则(一个类只做一件事情)等。 策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,使算法可以独立于使用它的客户而变化。这使得程序的扩展性和维护性都得到了提高。


本文链接:

https://pugqq.com/archives/strategy-pattern.html
设计模式 - 浅谈策略模式 - I/O
快来做第一个评论的人吧~

# 最近更新

Nginx的proxy_pass指令完全拆解2021-03-21

Nginx配置Jenkins域名访问2021-01-03

设计模式 - 浅谈备忘录模式2020-12-02

设计模式 - 浅谈中介者模式2020-11-23

设计模式 - 浅谈迭代器模式2020-11-02

MySQL5.7 字符集设置2020-10-26

设计模式 - 浅谈状态模式2020-10-23

设计模式 - 浅谈访问者模式2020-10-13

设计模式 - 浅谈观察者模式2020-10-12

设计模式 - 浅谈命令模式2020-09-21