C++20策略模式:灵活算法动态切换

精读C++20设计模式——行为型设计模式:策略模式

策略模式的核心思想

策略模式(Strategy Pattern)是一种行为型设计模式,允许在运行时选择算法的行为。它将算法封装在独立的类中,使得它们可以互相替换而不影响客户端代码。策略模式通过将算法与使用算法的代码解耦,提高了代码的灵活性和可维护性。

在C++20中,策略模式可以利用现代C++特性(如std::variantstd::function、概念约束等)实现更简洁和类型安全的代码。

策略模式的实现步骤

定义策略接口
策略模式的核心是定义一个抽象的策略接口,通常是一个纯虚基类或C++20中的概念(Concept)。所有具体策略类必须实现该接口。

class Strategy {
public:
    virtual ~Strategy() = default;
    virtual void execute() const = 0;
};

实现具体策略
每个具体策略类实现策略接口,提供不同的算法或行为。例如:

class ConcreteStrategyA : public Strategy {
public:
    void execute() const override {
        std::cout << "Executing Strategy A\n";
    }
};

class ConcreteStrategyB : public Strategy {
public:
    void execute() const override {
        std::cout << "Executing Strategy B\n";
    }
};

上下文类(Context)
上下文类持有一个策略对象的引用,并在运行时调用其方法。C++20中可以使用std::unique_ptrstd::variant管理策略对象。

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() const {
        if (strategy_) {
            strategy_->execute();
        }
    }
};

使用C++20特性优化策略模式

利用std::function替代继承
C++20允许使用std::function和Lambda表达式实现策略模式,避免继承带来的复杂性。

using StrategyFunc = std::function<void()>;

class Context {
private:
    StrategyFunc strategy_;
public:
    void setStrategy(StrategyFunc strategy) {
        strategy_ = strategy;
    }

    void executeStrategy() const {
        if (strategy_) {
            strategy_();
        }
    }
};

// 使用示例
Context ctx;
ctx.setStrategy([]() { std::cout << "Lambda Strategy\n"; });
ctx.executeStrategy();

结合概念(Concepts)约束策略类型
C++20的概念(Concepts)可以用于约束策略类型,确保传入的策略符合特定接口。

template <typename T>
concept StrategyConcept = requires(T t) {
    { t.execute() } -> std::same_as<void>;
};

template <StrategyConcept T>
class Context {
private:
    T strategy_;
public:
    Context(T strategy) : strategy_(strategy) {}

    void executeStrategy() const {
        strategy_.execute();
    }
};

策略模式的应用场景

  • 动态切换算法:例如排序算法(快速排序、归并排序)在运行时切换。
  • 避免条件分支:替代大量的if-elseswitch-case逻辑。
  • 测试与模拟:在单元测试中替换真实策略为模拟策略。

策略模式的优缺点

优点

  • 符合开闭原则(Open/Closed Principle),新增策略无需修改现有代码。
  • 提高代码复用性,策略类可以在不同上下文中共享。
  • 运行时灵活切换行为。

缺点

  • 可能增加类的数量,每个策略需要一个单独的类。
  • 客户端需要了解不同策略的差异。

总结

策略模式是C++20中实现灵活算法选择的强大工具,结合现代C++特性(如std::function、概念约束)可以进一步简化代码并提高类型安全性。适用于需要动态行为切换的场景,是行为型设计模式中的经典实现。

BbS.okacop010.info/PoSt/1120_661268.HtM
BbS.okacop011.info/PoSt/1120_588913.HtM
BbS.okacop012.info/PoSt/1120_439997.HtM
BbS.okacop013.info/PoSt/1120_701861.HtM
BbS.okacop014.info/PoSt/1120_403743.HtM
BbS.okacop015.info/PoSt/1120_411800.HtM
BbS.okacop016.info/PoSt/1120_014056.HtM
BbS.okacop017.info/PoSt/1120_691498.HtM
BbS.okacop018.info/PoSt/1120_541949.HtM
BbS.okacop019.info/PoSt/1120_407493.HtM
BbS.okacop010.info/PoSt/1120_306829.HtM
BbS.okacop011.info/PoSt/1120_356981.HtM
BbS.okacop012.info/PoSt/1120_741359.HtM
BbS.okacop013.info/PoSt/1120_306252.HtM
BbS.okacop014.info/PoSt/1120_576617.HtM
BbS.okacop015.info/PoSt/1120_851944.HtM
BbS.okacop016.info/PoSt/1120_919093.HtM
BbS.okacop017.info/PoSt/1120_661751.HtM
BbS.okacop018.info/PoSt/1120_213521.HtM
BbS.okacop019.info/PoSt/1120_147016.HtM
BbS.okacop010.info/PoSt/1120_096904.HtM
BbS.okacop011.info/PoSt/1120_062892.HtM
BbS.okacop012.info/PoSt/1120_630964.HtM
BbS.okacop013.info/PoSt/1120_983154.HtM
BbS.okacop014.info/PoSt/1120_294452.HtM
BbS.okacop015.info/PoSt/1120_833278.HtM
BbS.okacop016.info/PoSt/1120_882612.HtM
BbS.okacop017.info/PoSt/1120_681669.HtM
BbS.okacop018.info/PoSt/1120_069595.HtM
BbS.okacop019.info/PoSt/1120_630556.HtM
BbS.okacop010.info/PoSt/1120_041692.HtM
BbS.okacop011.info/PoSt/1120_466955.HtM
BbS.okacop012.info/PoSt/1120_883394.HtM
BbS.okacop013.info/PoSt/1120_920536.HtM
BbS.okacop014.info/PoSt/1120_364652.HtM
BbS.okacop015.info/PoSt/1120_146602.HtM
BbS.okacop016.info/PoSt/1120_095248.HtM
BbS.okacop017.info/PoSt/1120_431683.HtM
BbS.okacop018.info/PoSt/1120_457613.HtM
BbS.okacop019.info/PoSt/1120_175614.HtM
BbS.okacop010.info/PoSt/1120_441910.HtM
BbS.okacop011.info/PoSt/1120_203530.HtM
BbS.okacop012.info/PoSt/1120_812150.HtM
BbS.okacop013.info/PoSt/1120_119438.HtM
BbS.okacop014.info/PoSt/1120_154537.HtM
BbS.okacop015.info/PoSt/1120_841468.HtM
BbS.okacop016.info/PoSt/1120_101632.HtM
BbS.okacop017.info/PoSt/1120_667815.HtM
BbS.okacop018.info/PoSt/1120_522338.HtM
BbS.okacop019.info/PoSt/1120_413844.HtM
BbS.okacop020.info/PoSt/1120_631012.HtM
BbS.okacop021.info/PoSt/1120_954295.HtM
BbS.okacop022.info/PoSt/1120_450427.HtM
BbS.okacop023.info/PoSt/1120_562889.HtM
BbS.okacop024.info/PoSt/1120_489120.HtM
BbS.okacop025.info/PoSt/1120_199065.HtM
BbS.okacop026.info/PoSt/1120_143822.HtM
BbS.okacop027.info/PoSt/1120_037226.HtM
BbS.okacop028.info/PoSt/1120_709962.HtM
BbS.okacop029.info/PoSt/1120_211520.HtM
BbS.okacop020.info/PoSt/1120_808874.HtM
BbS.okacop021.info/PoSt/1120_255252.HtM
BbS.okacop022.info/PoSt/1120_109236.HtM
BbS.okacop023.info/PoSt/1120_658033.HtM
BbS.okacop024.info/PoSt/1120_366127.HtM
BbS.okacop025.info/PoSt/1120_215857.HtM
BbS.okacop026.info/PoSt/1120_731325.HtM
BbS.okacop027.info/PoSt/1120_137525.HtM
BbS.okacop028.info/PoSt/1120_633148.HtM
BbS.okacop029.info/PoSt/1120_370686.HtM
BbS.okacop020.info/PoSt/1120_446448.HtM
BbS.okacop021.info/PoSt/1120_739823.HtM
BbS.okacop022.info/PoSt/1120_357407.HtM
BbS.okacop023.info/PoSt/1120_530873.HtM
BbS.okacop024.info/PoSt/1120_928186.HtM
BbS.okacop025.info/PoSt/1120_252326.HtM
BbS.okacop026.info/PoSt/1120_643959.HtM
BbS.okacop027.info/PoSt/1120_524980.HtM
BbS.okacop028.info/PoSt/1120_318028.HtM
BbS.okacop029.info/PoSt/1120_835142.HtM

#牛客AI配图神器#

全部评论

相关推荐

Java面试先知:我也是和你一样的情况,hr 说等开奖就行了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务