当前位置:首页 > C++ > 正文

C++策略模式详解(从零开始掌握策略基类设计)

C++面向对象编程 中,策略模式 是一种非常实用且常见的行为型设计模式。它允许你定义一系列算法,并将每个算法封装起来,使它们可以互换使用。本教程将带你从零开始,一步步理解并实现 C++策略基类设计,即使你是编程小白也能轻松上手!

C++策略模式详解(从零开始掌握策略基类设计) C++策略模式 策略基类设计 C++面向对象编程 设计模式教程 第1张

什么是策略模式?

策略模式的核心思想是:将算法的实现与使用该算法的客户端代码解耦。通过定义一个策略基类(通常是抽象类或接口),不同的具体策略类继承该基类并实现各自的算法逻辑。这样,客户端可以在运行时动态切换策略,而无需修改原有代码。

为什么使用策略模式?

  • 避免使用大量的 if-else 或 switch 语句来选择不同算法。
  • 提高代码的可维护性和可扩展性。
  • 符合“开闭原则”:对扩展开放,对修改关闭。
  • 便于单元测试,每个策略可独立测试。

第一步:定义策略基类

在 C++ 中,我们通常使用纯虚函数来定义抽象基类。这个基类就是我们的策略基类

// Strategy.h#ifndef STRATEGY_H#define STRATEGY_H#include <iostream>class Strategy {public:    virtual ~Strategy() = default;        // 纯虚函数:定义策略接口    virtual void execute() const = 0;};#endif // STRATEGY_H

注意:virtual ~Strategy() = default; 提供了虚析构函数,确保通过基类指针删除派生类对象时能正确调用派生类的析构函数。

第二步:实现具体策略类

接下来,我们创建几个具体的策略类,它们都继承自 Strategy 基类,并实现 execute() 方法。

// ConcreteStrategies.h#ifndef CONCRETE_STRATEGIES_H#define CONCRETE_STRATEGIES_H#include "Strategy.h"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";    }};class ConcreteStrategyC : public Strategy {public:    void execute() const override {        std::cout << "执行策略 C:冒泡排序\n";    }};#endif // CONCRETE_STRATEGIES_H

第三步:创建上下文类(Context)

上下文类持有对策略对象的引用,并提供一个接口让客户端设置和使用策略。

// Context.h#ifndef CONTEXT_H#define CONTEXT_H#include "Strategy.h"#include <memory>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 doSomeBusinessLogic() const {        if (strategy_) {            strategy_->execute();        } else {            std::cout << "未设置策略!\n";        }    }};#endif // CONTEXT_H

第四步:在主函数中使用策略模式

// main.cpp#include "Context.h"#include "ConcreteStrategies.h"int main() {    // 创建上下文并初始化为策略 A    Context context(std::make_unique<ConcreteStrategyA>());    context.doSomeBusinessLogic();    // 动态切换到策略 B    context.setStrategy(std::make_unique<ConcreteStrategyB>());    context.doSomeBusinessLogic();    // 再次切换到策略 C    context.setStrategy(std::make_unique<ConcreteStrategyC>());    context.doSomeBusinessLogic();    return 0;}

运行结果:

执行策略 A:快速排序执行策略 B:归并排序执行策略 C:冒泡排序

总结

通过以上步骤,我们成功实现了 C++策略模式 的基本结构。这种 策略基类设计 方法极大地提升了代码的灵活性和可维护性。无论你是学习 C++面向对象编程 的新手,还是希望优化现有项目的开发者,掌握这一 设计模式教程 中的核心思想都将大有裨益。

记住:好的设计不是一蹴而就的,但策略模式为你提供了一种优雅的方式来管理变化的算法逻辑。快去试试吧!