策略模式上下文管理

策略管理上下文(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逻辑
  • 管理器:提供策略的监控、统计和管理功能

通过上下文,我们实现了策略选择逻辑与业务逻辑的彻底分离,让客户端代码更加简洁,也让策略模式的价值得到充分发挥。

相关推荐
LiLiYuan.8 分钟前
【Lombok库常用注解】
java·开发语言·python
不去幼儿园40 分钟前
【启发式算法】灰狼优化算法(Grey Wolf Optimizer, GWO)详细介绍(Python)
人工智能·python·算法·机器学习·启发式算法
二川bro43 分钟前
数据可视化进阶:Python动态图表制作实战
开发语言·python·信息可视化
青青子衿_211 小时前
TikTok爬取——视频、元数据、一级评论
爬虫·python·selenium
忘却的旋律dw2 小时前
使用LLM模型的tokenizer报错AttributeError: ‘dict‘ object has no attribute ‘model_type‘
人工智能·pytorch·python
20岁30年经验的码农2 小时前
Java RabbitMQ 实战指南
java·开发语言·python
柳暗花再明2 小时前
Visio 中设置文本框背景透明的方法
人工智能·windows
天庭鸡腿哥2 小时前
大小只有4K的软件,可让系统瞬间丝滑!
运维·服务器·windows·microsoft·everything
studytosky3 小时前
深度学习理论与实战:MNIST 手写数字分类实战
人工智能·pytorch·python·深度学习·机器学习·分类·matplotlib
上不如老下不如小4 小时前
2025年第七届全国高校计算机能力挑战赛初赛 Python组 编程题汇总
开发语言·python·算法