Spring Boot 项目怎么使用策略模式?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 策略模式是一种设计模式,它允许在运行时选择不同的算法或行为。此模式通过定义一系列算法并将它们封装在独立的类中实现,这些类可以互相替换。这样可以根据不同情况动态选择最适合的算法。在Spring框架中,可以通过依赖注入来实现策略模式。首先定义一个抽象策略类(接口或抽象类),然后创建具体策略类实现不同的算法。具体策略类通过`@Service`注解并在名称中指定特定的策略(如加法、减法等)。在上下文类(如Service类)中,通过`@Resource`注入策略对象的Map集合,根据需要选择并执行相应的策略。

什么是策略模式?

策略模式是一种设计模式,允许在运行时选择算法或行为的模式。其核心思想是定义一系列算法,把它们一个个封装起来,并使它们可以互相替换。这种模式能够根据不同的情况动态地选择最合适的算法。

通俗来说,在开发的过程中,需要针对不同的情况做执行不同的处理方法,单纯地写 if...else... 会导致扩展性和可维护性变差。


Spring 风格的策略模式

策略模式包含了 3 个部分,分别是:

  1. 上下文(Context)类:具体策略类的对象,本文主要介绍上下文类通过依赖注入的方式获取具体策略对象。
  2. 抽象策略(Abstract Strategy)类:定义了策略对象的公共接口或抽象类,具体策略类必须实现的方法。
  3. 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口或抽象类,包含了具体的算法实现。

为了方便对比,本文直接改写菜鸟教程的举例。

抽象策略类可以是接口也可以是抽象类,这里推荐使用抽象类。 因为抽象类方法里可以写一些公有逻辑,避免重复代码。

步骤1

创建一个抽象类。

java

代码解读

复制代码

public abstract class Strategy {
    public int doOperation(int num1, int num2) {
        System.out.println("公有逻辑...");
        return 0;
    }
}

步骤2

创建基础抽象类的具体策略类。

java

代码解读

复制代码

import org.springframework.stereotype.Service;

@Service("add")
public class OperationAdd extends Strategy{
    public int doOperation(int num1, int num2) {
        super.doOperation(num1, num2);
        System.out.println("执行加法计算");
        return num1 + num2;
    }
}

java

代码解读

复制代码

import org.springframework.stereotype.Service;

@Service("subtract")
public class OperationSubtract extends Strategy{
    public int doOperation(int num1, int num2) {
        super.doOperation(num1, num2);
        System.out.println("执行减法计算");
        return num1 - num2;
    }
}

java

代码解读

复制代码

import org.springframework.stereotype.Service;

@Service("multiply")
public class OperationMultiply extends Strategy {
    public int doOperation(int num1, int num2) {
        super.doOperation(num1, num2);
        System.out.println("执行乘法计算");
        return num1 * num2;
    }
}

步骤3(重点)

在上下文(Context)类中注入策略类并调用。上下文类就是执行算法的类,在项目中一般会是一个 Service 类。

java

代码解读

复制代码

@Service
public class ContextServiceImpl implements ContextService {
    // 注入策略对象,key是注册时的名称,value是策略对象
    @Resource
    private Map<String, Strategy> strategyMap;
    
    @Override
    public int executeStrategy(int num1, int num2) {
        // 执行加法策略对象
        Strategy addStrategy = strategyMap.get("add");
        int add = addStrategy.doOperation(num1, num2);
        System.out.println("add:"+add);

        // 执行减法策略对象
        Strategy subtractStrategy = strategyMap.get("subtract");
        int subtract = subtractStrategy.doOperation(num1, num2);
        System.out.println("subtract:"+subtract);

        // 执行乘法策略对象
        Strategy multiplyStrategy = strategyMap.get("multiply");
        int multiply = multiplyStrategy.doOperation(num1, num2);
        System.out.println("multiply:"+multiply);
        
        return 0;
    }
}

步骤4

测试一下。

java

代码解读

复制代码

@SpringBootTest
public class StrategyTest {
    @Resource
    private ContextService contextService;

    @Test
    public void test(){
        contextService.executeStrategy(10, 5);
    }
}

运行结果:

makefile

代码解读

复制代码

公有逻辑...
执行加法计算
add:15

公有逻辑...
执行减法计算
subtract:5

公有逻辑...
执行乘法计算
multiply:50

提示

在使用策略模式时,也需要注意不要过度使用,特别是在只有少数策略时(少于3个),或者策略很不可能变化时。因为引入策略模式会增加一些对象的创建和交互,可能会引入额外的复杂性。正确的应用策略模式可以使系统设计更加灵活,易于维护和扩展。


转载来源:https://juejin.cn/post/7372100124635791370

相关文章
|
4天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
14 2
|
1月前
|
设计模式 前端开发 Java
Spring MVC——项目创建和建立请求连接
MVC是一种软件架构设计模式,将应用分为模型、视图和控制器三部分。Spring MVC是基于MVC模式的Web框架,通过`@RequestMapping`等注解实现URL路由映射,支持GET和POST请求,并可传递参数。创建Spring MVC项目与Spring Boot类似,使用`@RestController`注解标记控制器类。
34 1
Spring MVC——项目创建和建立请求连接
|
1月前
|
Java 关系型数据库 MySQL
Maven——创建 Spring Boot项目
Maven 是一个项目管理工具,通过配置 `pom.xml` 文件自动获取所需的 jar 包,简化了项目的构建和管理过程。其核心功能包括项目构建和依赖管理,支持创建、编译、测试、打包和发布项目。Maven 仓库分为本地仓库和远程仓库,远程仓库包括中央仓库、私服和其他公共库。此外,文档还介绍了如何创建第一个 SpringBoot 项目并实现简单的 HTTP 请求响应。
114 1
Maven——创建 Spring Boot项目
|
1月前
|
Java 关系型数据库 MySQL
如何使用 maven 创建一个 Spring Boot项目
Maven 是一个强大的项目管理工具,通过配置 `pom.xml` 文件自动获取所需的 jar 包,提高开发效率。其核心功能包括项目构建和依赖管理。项目构建支持编译、测试、打包和发布等流程,而依赖管理则通过中央仓库、本地仓库和私有服务器获取和管理项目依赖。示例中展示了如何创建第一个 SpringBoot 项目并实现简单接口。
24 1
如何使用 maven 创建一个 Spring Boot项目
|
1月前
|
Java 应用服务中间件 Android开发
Eclipse创建Spring项目
本文介绍了在Eclipse中创建Spring项目的步骤,包括如何配置Tomcat服务器、创建项目、部署项目到Tomcat以及添加Spring框架所需的JAR包。
51 1
Eclipse创建Spring项目
|
1月前
|
Java Spring
ij社区版如何创建spring项目
如何在IntelliJ IDEA社区版中创建Spring项目,包括安装Spring Boot Helper插件的步骤和创建过程。
65 1
ij社区版如何创建spring项目
|
1月前
|
Java Apache Maven
Java/Spring项目的包开头为什么是com?
本文介绍了 Maven 项目的初始结构,并详细解释了 Java 包命名惯例中的域名反转规则。通过域名反转(如 `com.example`),可以确保包名的唯一性,避免命名冲突,提高代码的可读性和逻辑分层。文章还讨论了域名反转的好处,包括避免命名冲突、全球唯一性、提高代码可读性和逻辑分层。最后,作者提出了一个关于包名的问题,引发读者思考。
Java/Spring项目的包开头为什么是com?
|
1月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
53 2
|
1月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
167 2
|
1月前
|
前端开发 安全 Java
【Spring】Spring Boot项目创建和目录介绍
【Spring】Spring Boot项目创建和目录介绍
83 2