策略模式通过抽象基类定义接口,具体策略类继承实现,上下文类动态持有策略对象,实现算法与客户端解耦。

策略模式是一种行为设计模式,它让你定义一系列算法或策略,并将每种算法分别放入独立的类中,使算法的变化独立于使用它的客户端。在C++中实现策略模式,核心是通过抽象基类定义接口,然后让具体策略类继承并实现该接口,再由上下文类持有策略对象的指针或引用,从而在运行时动态切换策略。
定义策略接口
首先创建一个抽象基类,声明策略的公共接口。通常是一个虚函数,用于执行具体的算法逻辑。
class Strategy {
public:
virtual ~Strategy() = default;
virtual void execute() const = 0;
};
实现具体策略类
每个具体策略继承自Strategy,并实现自己的execute方法。比如:
class ConcreteStrategyA : public Strategy {
public:
void execute() const override {
std::cout << "执行策略 A\n";
}
};
class ConcreteStrategyB : public Strategy {
public:
void execute() const override {
std::cout << "执行策略 B\n";
}
};
上下文类使用策略
上下文类持有一个指向Strategy的指针或引用,可以在构造时传入,也可以在运行时更换。
立即学习“C++免费学习笔记(深入)”;
class Context {
private:
std::unique_ptr<Strategy> strategy_;
public:
explicit Context(std::unique_ptr<Strategy> strategy)
: strategy_(std::move(strategy)) {}
void setStrategy(std::unique_ptr<Strategy> strategy) {
strategy_ = std::move(strategy);
}
void run() const {
if (strategy_) {
strategy_->execute();
}
}
};
使用示例
在主函数中,可以灵活地切换不同策略:
int main() {
Context context{std::make_unique<ConcreteStrategyA>()};
context.run(); // 输出:执行策略 A
context.setStrategy(std::make_unique<ConcreteStrategyB>());
context.run(); // 输出:执行策略 B
return 0;
}
关键点总结:
- 策略接口统一调用方式,解耦算法与使用者
- 使用智能指针管理策略生命周期,避免内存泄漏
- 支持运行时动态更换策略,提升灵活性
- 适用于多种算法可互换的场景,如排序、压缩、支付方式等











