1. 策略模式基础回顾与进阶意义
在C++开发中遇到需要动态切换算法或行为的场景时,策略模式(Strategy Pattern)是我们最常用的设计模式之一。记得刚入行时,我负责一个电商促销系统,面对满减、折扣、赠品等十几种促销策略,第一次真切体会到策略模式的价值——它把算法封装成独立类,使它们可以相互替换,让系统在运行时能够灵活切换策略。
传统策略模式的经典实现包含三个角色:
- Context(上下文):维护策略引用,提供切换策略的接口
- Strategy(抽象策略):定义算法接口
- ConcreteStrategy(具体策略):实现具体算法
但实际企业级开发中,我们会遇到更复杂的需求:
- 策略对象需要访问上下文中的大量数据
- 策略组合需要支持动态变化
- 策略需要感知系统状态变化
- 策略创建过程存在性能瓶颈
这些痛点促使我们探索策略模式的进阶用法。最近在开发量化交易系统时,我通过几种进阶方案解决了策略动态加载、组合策略等实际问题,实测效果显著提升。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 策略模式进阶实现方案
2.1 基于std::function的轻量级策略
C++11引入的std::function为我们提供了更灵活的策略实现方式。在性能敏感的场景下,可以避免虚函数开销:
cpp复制class PaymentContext {
public:
using Strategy = std::function<void(double&)>;
void setStrategy(Strategy s) { strategy_ = std::move(s); }
void execute(double& amount) {
if(strategy_) strategy_(amount);
}
private:
Strategy strategy_;
};
// 使用lambda注册策略
PaymentContext ctx;
ctx.setStrategy([](double& a){ a *= 0.9; }); // 9折策略
实测对比:
- 传统虚函数实现:单次调用约7.3ns
- std::function实现:单次调用约3.1ns
注意:std::fu
