设计模式--策略(Strategy)模式


概念

策略模式是一种行为设计模式,它允许定义一系列算法,并将每个算法封装到一个对象中这些算法对象可以相互替换,使得客户端调用算法的代码具体算法的实现分离。在C++中,策略模式通常由一个接口类、具体策略类、上下文类和客户端代码组成。

下面是一个使用C++实现策略模式的示例:
类图:

代码实现:

#include <iostream>
#include <memory>
#include <string>
#include <algorithm>

// 策略接口类
class Strategy {
public:
    virtual void doAlgorithm(std::string& data) = 0;
    virtual ~Strategy() {}
};

// 具体策略类A
class ConcreteStrategyA : public Strategy {
public:
    void doAlgorithm(std::string& data) override {
        std::sort(data.begin(), data.end());
        std::cout << "ConcreteStrategyA: " << data << std::endl;
    }
};

// 具体策略类B
class ConcreteStrategyB : public Strategy {
public:
    void doAlgorithm(std::string& data) override {
        std::sort(data.begin(), data.end(), std::greater<>());
        std::cout << "ConcreteStrategyB: " << data << std::endl;
    }
};

// 上下文类
class Context {
private:
    std::unique_ptr<Strategy> strategy_;
public:
    void setStrategy(std::unique_ptr<Strategy> strategy) {
        strategy_ = std::move(strategy);
    }
    void executeStrategy(std::string& data) {
        if (strategy_) {
            strategy_->doAlgorithm(data);
        }
    }
};

// 客户端代码
int main() {
    Context context;
    std::string data = "aecbd";

    std::unique_ptr<Strategy> strategyA = std::make_unique<ConcreteStrategyA>();
    context.setStrategy(std::move(strategyA));
    context.executeStrategy(data);

    std::unique_ptr<Strategy> strategyB = std::make_unique<ConcreteStrategyB>();
    context.setStrategy(std::move(strategyB));
    context.executeStrategy(data);

    return 0;
}

在这个示例中,我们定义了一个策略接口类Strategy,并实现了两个具体的策略类ConcreteStrategyAConcreteStrategyB。上下文类Context持有一个策略对象,并在客户端代码中可以动态地切换不同的策略来执行算法。

这个示例展示了策略模式的核心思想,即将算法的实现与调用代码分离,使得算法可以独立变化,而不影响客户端代码。

使用场景

在实际开发中,策略模式通常在以下情况下被选择使用:

  1. 多算法选择:当一个系统需要在运行时动态地选择算法时,策略模式非常有用。例如,一个排序算法可以根据用户的选择来进行升序排序、降序排序或其他定制排序。

  2. 减少条件语句:策略模式可以帮助减少大量的条件语句。如果一个系统中存在大量的条件判断,可以使用策略模式将不同的条件分支封装到不同的策略类中,从而使代码更加清晰和易于维护。

  3. 算法的独立性:当需要将算法的实现与调用代码分离,使得算法可以独立变化时,策略模式非常适用。这样可以使得系统更加灵活,易于扩展和维护。

  4. 测试和复用:策略模式可以帮助提高代码的可测试性和可复用性。每个策略类都可以独立进行单元测试,并且可以在不同的上下文中被复用。

总之,策略模式适用于需要在运行时动态选择算法、减少条件语句、提高代码的灵活性和可维护性的情况下。

posted @   guanyubo  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示