在 Spring Boot 中,我们可以利用其强大的依赖注入(DI)和组件扫描(Component Scan)特性,非常优雅地实现和管理策略模式。
核心思想:
- 定义策略接口(Strategy Interface): 定义一个所有具体策略类都必须实现的公共接口。这个接口通常包含一个或多个方法,代表策略要执行的操作。
- 创建具体策略实现(Concrete Strategies): 实现策略接口,每个实现类代表一种具体的实现行为。
- 创建上下文(Context): 持有一个策略接口的引用。上下文不直接实现业务逻辑,而是委托给其持有的策略对象。上下文提供一个方法让客户端设置或改变策略,并提供一个执行策略的方法。
- 客户端(Client): 创建具体的策略对象,并将其设置到上下文中。然后调用上下文的方法来执行策略。
在 Spring Boot 中的实现优势:
- 自动发现和注册: 使用
@Component或其衍生注解(@Service,@Repository等),Spring 可以自动扫描并注册所有的具体策略实现到 IoC 容器中。 - 依赖注入: 上下文或其他需要使用策略的服务可以通过
@Autowired或构造函数注入的方式,轻松获取所有或特定的策略实现。 - 解耦: Spring 的 DI 机制进一步加强了策略模式的解耦特性。上下文不需要知道如何创建策略对象,只需要声明对策略接口的依赖。
- 易于扩展: 添加新的策略只需要创建一个新的实现类并标记为 Spring Bean,无需修改现有代码(符合开闭原则)。
实现步骤详解 (附带示例):
假设我们要实现一个订单处理系统,根据不同的订单类型(普通订单、促销订单、会员订单)有不同的处理逻辑(例如计算折扣、积分等)。
步骤 1: 定义策略接口
package com.example.strategydemo.strategy;
// 策略接口:定义订单处理逻辑
public interface OrderHandlerStrategy {
/**
* 判断当前策略是否适用于给定的订单类型
* @param orderType 订单类型标识 ("NORMAL", "PROMOTION", "VIP")
* @return true 如果适用, false 否则
*/
boolean supports(String orderType);
/**
* 处理订单的具体逻辑
* @param orderId 订单ID
* @return 处理结果描述
*/
String handleOrder(Long orderId);
}
supports(String orderType): 这个方法用于标识哪个策略实现应该处理特定类型的请求。handleOrder(Long orderId): 这是策略的核心执行方法。
步骤 2: 创建具体策略实现
为每种订单类型创建一个实现类,并使用 @Component 或 @Service 注解标记为 Spring Bean。
package com.example.strategydemo.strategy.impl;
import com.example.strategydemo.strategy.OrderHandlerStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; // 或者 @Service
@Component // 标记为 Spring Bean
public class NormalOrderHandler implements OrderHandlerStrategy {
private static final Logger log = LoggerFactory.getLogger(NormalOrderHandler.class);
private static final String ORDER_TYPE = "NORMAL";
@Override
public boolean supports(String orderType) {
return ORDER_TYPE.equalsIgnoreCase(orderType);
}
@Override
public String handleOrder(Long orderId) {
log.info("Processing normal order with ID: {}", orderId);
// ... 普通订单的具体处理逻辑 ...
return "Normal order " + orderId + " processed successfully.";
}
}
package com.example.strategydemo.strategy.impl;
import com.example.strategydemo.strategy.OrderHandlerStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class PromotionOrderHandler implements OrderHandlerStrategy {
private static final Logger log

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



