Spring Boot中策略模式结合依赖注入的实现方式

在Spring Boot项目开发中,常常会遇到根据不同的业务场景执行不同逻辑的需求,策略模式就是一种很好的设计模式来应对这种情况。同时,Spring Boot强大的依赖注入机制可以方便地将不同的策略类进行管理和调用。

1. 定义策略接口

定义一个策略接口,所有具体的策略类都将实现这个接口:

java 复制代码
public interface BaseStrategy {
    void handle(String request);
}

2. 实现具体的策略

实现几个具体的策略类,例如处理订单和支付:

java 复制代码
@Component("order")
@Slf4j
public class OrderStrategy implements BaseStrategy {

    @Override
    public void handle(String request) {
        System.out.println("下单成功" + request);
    }
}

@Component("pay")
@Slf4j
public class PayStrategy implements BaseStrategy {

    @Override
    public void handle(String request) {
        System.out.println("支付成功" + request);
    }
}

也可以通过配置类的方式注入策略模式实现类,先注释其中的@Component注解

java 复制代码
@Configuration
public class HandlerConfig {

    @Bean("order")
    public BaseStrategy handleOrder() {
       return new OrderStrategy();
    }

    @Bean("pay")
    public BaseStrategy handlePay() {
        return new PayStrategy();
    }
}

3. 创建策略工厂

为了方便获取不同的策略,我们可以创建一个工厂类 BaseFactory,它将通过依赖注入管理策略的实例,并提供获取策略的功能。

java 复制代码
@Component
@Slf4j
public class BaseFactory {

    @Resource
    private Map<String, BaseStrategy> handlerMap;

    public BaseStrategy getHandler(String type) {
        return handlerMap.getOrDefault(type, (request) -> {
            log.error("Unknown request type: " + type);
        });
    }
}

在这个类中,我们使用 @Resource 注解注入了一个 Map<String, BaseStrategy>,这个 Map 将所有注册的策略按名称存储起来。通过策略名称,我们可以从 Map 中获取到对应的策略对象。

4. 使用策略工厂处理请求

java 复制代码
@RestController
@RequestMapping("base")
@Slf4j
public class BaseController {

    @Resource
    private BaseFactory baseFactory;

    @GetMapping("/getHandler")
    public ResponseEntity<String> getHandler(@RequestParam String type, @RequestParam String message) {
        BaseStrategy handler = baseFactory.getHandler(type);
        if (handler != null) {
            handler.handle(message);
            return ResponseEntity.ok("操作已执行: " + type);
        } else {
            return ResponseEntity.badRequest().body("策略类型不存在: " + type);
        }
    }
}
相关推荐
yoyo_zzm5 小时前
Laravel6.x新特性全解析
java·spring boot·后端
源码宝5 小时前
基于 SpringBoot + Vue 的医院随访系统:技术架构与功能实现
java·vue.js·spring boot·架构·源码·随访系统·随访管理
空中海7 小时前
Spring Boot 专家级面试题库
spring boot·后端·面试
空中海8 小时前
第二篇:注册中心篇 — Nacos 与 Eureka 服务注册发现
spring boot·云原生·eureka
直奔標竿8 小时前
SpringAI + RAG + MCP + Agent 零基础全栈实战(完结篇)| 27课完整汇总,Java开发者AI转型必看
java·开发语言·人工智能·spring boot·后端·spring
逍遥德8 小时前
SpringBoot数据库连接池HikariCP,Druid,Tomcat JDBC,DBCP2,c3p0配置使用
数据库·spring boot·tomcat
学术阿凡提9 小时前
Spring Boot 集成 Fastjson2 完整教程:从入门到避坑
spring boot·安全·json
也许明天y10 小时前
LangChain4j + Spring Boot 多智能体协调架构原理深度解析
spring boot·后端·agent
阿丰资源11 小时前
基于Spring Boot的新闻推荐系统(源码+数据库+文档)
数据库·spring boot·后端
身如柳絮随风扬12 小时前
Spring Boot + Spring Cloud 集成 Elasticsearch:从零搭建企业级搜索服务
spring boot·elasticsearch·spring cloud