设计模式二十四章经之策略模式

时间:2022-06-01
本文章向大家介绍设计模式二十四章经之策略模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

今天有人看了我之前的推文,说我的作息不正常,我就这么被diss了。当然了,懂的人自然懂,不懂的人和他说到最后就是对喷。我也就懒得解释了,下面进入正文。

概述

策略模式在我们日常开发中也是经常遇见的。比如实现某一个功能有多种算法或者策略。我们根据具体情况去实现它。例如:排序算法,我们可以使用插入、冒泡、快排等等。

针对这种情况,我们一般将多个策略写在一个工具类中去方便调用。我们需要A策略就是调用A方法,需要B策略就调用B方法。

如果将这些算法或者策略抽象出来,变成一个接口,不同的策略有不同的实现类。这样我们就可以通过注入不同的对象去实现策略的动态替换,这种模式可扩展和可维护性都很高。

使用场景

1、针对同一类型的问题多种的处理方法。

2、需要安全的封装多种同一类型的操作时。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

具体实现

创建一个接口:

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

创建2个实体类去实现此接口:

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

现在我们创建一个工具类:

public class Utils {
   private Strategy strategy;
   public Utils(Strategy strategy){
      this.strategy = strategy;
   }
   public int executeStrategy(int num1, int num2){
      return strategy.doOperation(num1, num2);
   }
}

最后我们在主函数中去实现:

public class Demo {
   public static void main(String[] args) {
      Utils utils = new Utils(new OperationAdd());        
      System.out.println("10 + 5 = " + utils.executeStrategy(10, 5));
      context = new Context(new OperationSubstract());        
      System.out.println("10 - 5 = " + utils.executeStrategy(10, 5));
   }
}

输出:

10 + 5 = 15
10 - 5 = 5

总结

策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。这个模式很好的演示的开闭原则,也就是定义抽象,注入不同的实现,从而达到更好的可扩展性。

优点:

  • 结构清晰明了,使用简单直观
  • 耦合度相对而言较低,扩展方便
  • 操作封装更为彻底,数据安全

缺点:

  • 随着策略的增加,子类也会变得繁多。
  • 所有策略类都需要对外暴露。