[设计模式] 浅谈策略模式

2024 年 5 月 7 日 星期二
/ ,
13
1

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

策略模式

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

模式思路与原理

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

案例

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

使用场景:

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

优缺点

优点:

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

缺点:

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

总结

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

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...