二十三种设计模式第十四篇--策略模式

策略模式:主要围绕一个类的行为或者其算法在运行时更改,也是一种行为型模式。

在软件开发中,我们经常遇到需要根据不同的情况选择不同算法或行为的情况。传统的做法是使用大量的条件语句来实现这种逻辑,但这样的实现方式往往难以维护和扩展。策略模式(Strategy Pattern)提供了一种优雅的解决方案,可以让我们灵活地处理多种算法和行为,同时提高代码的可维护性和可扩展性。

策略模式的意义

策略模式的主要目的是将算法的定义、实现和使用相互解耦,使得它们可以独立变化 。它通过将不同的算法封装在独立的策略类中,并定义一个通用的接口或抽象类来统一它们的调用方式。这样一来,客户端只需要与通用接口交互,而不需要关心具体的算法实现细节。

策略模式的核心思想是将算法视为一个可互换的组件,客户端可以在运行时动态地选择适合的策略。这种灵活性使得策略模式特别适用于需要根据不同的条件或偏好来调整算法的情况。例如,一个电商平台可以根据用户的购买历史和偏好选择不同的优惠策略来计算商品的价格。

策略模式的实现

在策略模式中,我们通常会定义一个策略接口或抽象类,用于统一不同策略的调用方式。然后,针对每种具体的算法或行为,我们创建相应的策略类,实现策略接口,并提供具体的算法实现。

客户端在需要使用算法的地方,通过策略接口与具体的策略类进行交互。客户端可以根据实际需求,在运行时动态地选择合适的策略类,并将其注入到上下文对象中。上下文对象负责调用所选策略的算法,并返回结果给客户端。

这种结构使得我们可以灵活地添加新的策略类或修改现有的策略类,而不会对客户端代码产生影响。策略模式将算法的变化对客户端透明,使得客户端只需要关注业务逻辑,而不需要关心具体的算法实现。

策略模式的优点

使用策略模式可以带来多个优点:

  1. 灵活性和可扩展性:策略模式通过将算法封装在独立的策略类中,使得可以在运行时动态地选择和切换算法,而无需修改客户端的代码。这种灵活性使得系统更容易扩展和适应变化。
  2. 可维护性:策略模式将不同的算法或行为封装在独立的策略类中,使得代码结构清晰,易于理解和维护。每个策略类负责实现一个特定的算法,修改或调试一个策略对其他策略没有影响,降低了代码的复杂性。
  3. 代码复用:策略模式可以促进代码的复用。不同的策略类可以共享相同的接口或抽象类,从而使得相似的算法可以通过继承或实现来共享代码。这样可以避免代码的重复编写,提高开发效率。

策略模式的应用场景

策略模式在以下情况下特别适用:

  1. 当需要根据不同的条件或偏好选择不同算法或行为时,可以使用策略模式来灵活地切换和调整算法。
  2. 当有多个相似的算法或行为,但它们的实现细节不同,可以将每个算法封装在独立的策略类中,以提高代码的可读性和可维护性。
  3. 当某个算法的实现经常变化,或者希望在运行时动态地选择算法时,可以使用策略模式来避免频繁修改客户端的代码。
  4. 当需要将算法的定义、实现和使用相互解耦,以提高代码的模块化和可测试性时,策略模式也是一个很好的选择。

代码实现

java 复制代码
public interface Strategy {

   public int doOperation(int num1, int num2);

}
java 复制代码
public class OperationAdd implements Strategy {
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}
java 复制代码
public class OperationMultiply implements Strategy {
   @Override
   public int doOperation(int num1, int num2) {
      return num1 * num2;
   }
}
java 复制代码
public class OperationSubtract implements Strategy {
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}
java 复制代码
public class Context {
   //真实采用的策略
   private Strategy strategy;
 
   public Context(Strategy strategy){
      this.strategy = strategy;
   }
 
   public int executeStrategy(int num1, int num2){

      return strategy.doOperation(num1, num2);
   }


}
java 复制代码
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 OperationSubtract());      
      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
 
      context = new Context(new OperationMultiply());    
      System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
   }
}

结论

策略模式是一种优秀的设计模式,它能够灵活地处理多种算法和行为,提高代码的可维护性、可扩展性和可测试性。通过将算法封装在独立的策略类中,并通过统一的接口来调用,我们可以使得算法的变化对客户端透明,从而降低了代码的耦合性。策略模式的应用可以让我们的代码更加灵活、可读和可维护,是值得推广和应用的一种设计模式。

相关推荐
rannn_1112 分钟前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
qq_12498707536 分钟前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
短剑重铸之日12 分钟前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
若鱼191935 分钟前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
觉醒大王44 分钟前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
努力学编程呀(๑•ี_เ•ี๑)1 小时前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
码农小卡拉1 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
向上的车轮1 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu1 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
跳动的梦想家h1 小时前
环境配置 + AI 提效双管齐下
java·vue.js·spring