linux开发

策略模式

策略模式的封面

C++策略模式的模板实现:

策略模式基本模板

#include <iostream>
#include <memory>

// 1. 定义策略接口
class Strategy {
public:
    virtual ~Strategy() = default;
    virtual void execute() = 0;
};

// 2. 具体策略实现
class ConcreteStrategyA : public Strategy {
public:
    void execute() override {
        std::cout << "执行策略 A" << std::endl;
    }
};

class ConcreteStrategyB : public Strategy {
public:
    void execute() override {
        std::cout << "执行策略 B" << std::endl;
    }
};

class ConcreteStrategyC : public Strategy {
public:
    void execute() override {
        std::cout << "执行策略 C" << std::endl;
    }
};

// 3. 上下文类
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 executeStrategy() {
        if (strategy_) {
            strategy_->execute();
        }
    }
};

// 4. 使用示例
int main() {
    // 使用策略A
    Context context(std::make_unique<ConcreteStrategyA>());
    context.executeStrategy();

    // 切换到策略B
    context.setStrategy(std::make_unique<ConcreteStrategyB>());
    context.executeStrategy();

    // 切换到策略C
    context.setStrategy(std::make_unique<ConcreteStrategyC>());
    context.executeStrategy();

    return 0;
}

带参数的策略模式模板

#include <iostream>
#include <memory>

// 策略接口(带参数)
class CalculationStrategy {
public:
    virtual ~CalculationStrategy() = default;
    virtual double calculate(double a, double b) = 0;
};

// 具体策略实现
class AddStrategy : public CalculationStrategy {
public:
    double calculate(double a, double b) override {
        return a + b;
    }
};

class SubtractStrategy : public CalculationStrategy {
public:
    double calculate(double a, double b) override {
        return a - b;
    }
};

class MultiplyStrategy : public CalculationStrategy {
public:
    double calculate(double a, double b) override {
        return a * b;
    }
};

class DivideStrategy : public CalculationStrategy {
public:
    double calculate(double a, double b) override {
        if (b != 0) {
            return a / b;
        }
        throw std::invalid_argument("除数不能为零");
    }
};

// 上下文类
class Calculator {
private:
    std::unique_ptr<CalculationStrategy> strategy_;

public:
    explicit Calculator(std::unique_ptr<CalculationStrategy> strategy)
        : strategy_(std::move(strategy)) {}

    void setStrategy(std::unique_ptr<CalculationStrategy> strategy) {
        strategy_ = std::move(strategy);
    }

    double execute(double a, double b) {
        if (strategy_) {
            return strategy_->calculate(a, b);
        }
        throw std::runtime_error("未设置计算策略");
    }
};

// 使用示例
int main() {
    Calculator calculator(std::make_unique<AddStrategy>());
    
    std::cout << "10 + 5 = " << calculator.execute(10, 5) << std::endl;
    
    calculator.setStrategy(std::make_unique<SubtractStrategy>());
    std::cout << "10 - 5 = " << calculator.execute(10, 5) << std::endl;
    
    calculator.setStrategy(std::make_unique<MultiplyStrategy>());
    std::cout << "10 * 5 = " << calculator.execute(10, 5) << std::endl;
    
    calculator.setStrategy(std::make_unique<DivideStrategy>());
    std::cout << "10 / 5 = " << calculator.execute(10, 5) << std::endl;

    return 0;
}

这个模板提供了策略模式的核心结构:

  • Strategy:策略接口
  • ConcreteStrategy:具体策略实现
  • Context:上下文类,持有并使用策略
  • 支持运行时动态切换策略