策略管理上下文(MqProducerContext)是策略模式中的核心协调者,它负责统一管理和调度各个具体策略。让我详细解释它的作用:
策略管理上下文的主要职责
1. 策略注册与映射管理
java
// 初始化时自动注册所有策略
@Autowired
public MqProducerContext(List<MqProducerStrategy> strategies,
MqProducerStrategy defaultStrategy) {
this.defaultStrategy = defaultStrategy;
// 建立消息类型与策略的映射关系
for (MqProducerStrategy strategy : strategies) {
for (MessageType messageType : MessageType.values()) {
if (strategy.supports(messageType)) {
strategyMap.put(messageType, strategy);
break;
}
}
}
}
作用:自动扫描所有策略实现,建立消息类型→策略的映射表。
2. 策略路由与选择
java
// 根据消息类型路由到合适的策略
public MqProducer getMqProducer(MessageType messageType) {
MqProducerStrategy strategy = strategyMap.get(messageType);
if (strategy == null) {
strategy = defaultStrategy; // 降级到默认策略
}
return strategy.getMqProducer();
}
作用:根据输入的消息类型,智能选择对应的策略,避免客户端直接与具体策略耦合。
3. 统一入口封装
java
// 为客户端提供统一的简单接口
public void sendMessage(LocalMessage localMessage) {
MqProducer producer = getMqProducer(localMessage);
producer.send(localMessage.getTopic(), localMessage.getContent());
}
作用:客户端只需要调用一个简单方法,无需关心内部复杂的策略选择逻辑。
没有上下文时的对比
❌ 没有上下文(策略模式使用不当)
java
@Service
public class MessageService {
@Autowired
private List<MqProducerStrategy> strategies;
public void sendMessage(LocalMessage message) {
// 客户端需要自己遍历策略
for (MqProducerStrategy strategy : strategies) {
if (strategy.supports(message.getMessageType())) {
MqProducer producer = strategy.getMqProducer();
producer.send(message.getTopic(), message.getContent());
return;
}
}
// 还要处理默认策略
throw new RuntimeException("No strategy found");
}
}
问题:策略选择逻辑分散在各个客户端,重复代码,难以维护。
✅ 有上下文(正确的策略模式)
java
@Service
public class MessageService {
@Autowired
private MqProducerContext mqProducerContext; // 统一入口
public void sendMessage(LocalMessage message) {
// 一行代码搞定,策略选择被封装
mqProducerContext.sendMessage(message);
}
}
上下文的具体价值
1. 降低客户端复杂度
java
// 客户端使用示例
public class BusinessService {
@Autowired
private MqProducerContext mqProducerContext;
public void processOrder(Order order) {
LocalMessage message = new LocalMessage(
MessageType.ORDER_MESSAGE,
order.toJson(),
"order_topic"
);
// 简单调用,不关心具体策略
mqProducerContext.sendMessage(message);
}
}
2. 集中处理公共逻辑
java
// 在上下文中可以统一添加监控、日志、异常处理等
public void sendMessage(LocalMessage localMessage) {
long startTime = System.currentTimeMillis();
try {
MqProducer producer = getMqProducer(localMessage);
producer.send(localMessage.getTopic(), localMessage.getContent());
// 统一监控
metrics.recordSuccess(localMessage.getMessageType(),
System.currentTimeMillis() - startTime);
} catch (Exception e) {
// 统一异常处理
metrics.recordError(localMessage.getMessageType());
logger.error("消息发送失败: {}", localMessage.getMessageType(), e);
throw new MessageSendException("发送失败", e);
}
}
3. 策略生命周期管理
java
@Component
public class MqProducerContext implements DisposableBean {
@PreDestroy
@Override
public void destroy() {
// 统一关闭所有生产者
strategyMap.values().forEach(strategy -> {
try {
strategy.getMqProducer().shutdown();
} catch (Exception e) {
logger.warn("关闭生产者失败", e);
}
});
}
// 重新加载策略(动态更新)
public void reloadStrategies() {
strategyMap.clear();
// 重新初始化逻辑...
}
}
4. 提供管理接口
java
// 策略监控和管理
@RestController
public class StrategyController {
@Autowired
private MqProducerContext mqProducerContext;
@GetMapping("/strategies/info")
public Map<String, String> getStrategyInfo() {
return mqProducerContext.getStrategyInfo().entrySet().stream()
.collect(Collectors.toMap(
e -> e.getKey().name(),
Map.Entry::getValue
));
}
@GetMapping("/strategies/statistics")
public Map<String, Object> getStrategyStatistics() {
// 返回策略使用统计等信息
}
}
总结
策略管理上下文就像是策略模式的"大脑":
- 注册中心:管理所有策略的注册和发现
- 路由器:根据输入条件路由到合适的策略
- 门面:为客户端提供统一的简单接口
- 协调器:处理策略间的协作和fallback逻辑
- 管理器:提供策略的监控、统计和管理功能
通过上下文,我们实现了策略选择逻辑与业务逻辑的彻底分离,让客户端代码更加简洁,也让策略模式的价值得到充分发挥。