策略模式的核心思想

策略模式属于行为型设计模式,允许在运行时选择算法的具体实现。其核心是将算法族封装为独立类,使它们可以互相替换,且算法的变化不影响使用算法的客户端。

模式结构

  • Context(上下文):持有一个策略对象的引用,通过接口调用具体策略。
  • Strategy(抽象策略):定义算法接口,通常为抽象类或纯虚接口。
  • ConcreteStrategy(具体策略):实现策略接口的具体算法。

C++实现示例

#include <iostream>
#include <memory>

// 抽象策略类
class Strategy {
public:
    virtual void execute() const = 0;
    virtual ~Strategy() = default;
};

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

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

// 上下文类
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> newStrategy) {
        strategy = std::move(newStrategy);
    }

    void executeStrategy() const {
        if (strategy) {
            strategy->execute();
        }
    }
};

// 客户端代码
int main() {
    auto context = Context(std::make_unique<ConcreteStrategyA>());
    context.executeStrategy(); // 输出: Executing Strategy A

    context.setStrategy(std::make_unique<ConcreteStrategyB>());
    context.executeStrategy(); // 输出: Executing Strategy B
    return 0;
}

应用场景

  • 需要动态切换算法时(如排序、压缩算法)。
  • 避免多重条件语句导致的代码臃肿。
  • 算法需要独立于客户端变化。

优缺点分析

优点

  • 符合开闭原则,新增策略无需修改上下文。
  • 消除条件分支,提升代码可维护性。

缺点

  • 客户端需了解不同策略的差异。
  • 策略类数量可能过多,增加系统复杂度。

扩展:策略模式与工厂模式结合

通过工厂模式创建策略对象,进一步解耦客户端与具体策略:

class StrategyFactory {
public:
    static std::unique_ptr<Strategy> createStrategy(const std::string& type) {
        if (type == "A") return std::make_unique<ConcreteStrategyA>();
        if (type == "B") return std::make_unique<ConcreteStrategyB>();
        return nullptr;
    }
};

实际案例:游戏中的角色行为

在游戏中,角色的移动行为(行走、奔跑、飞行)可封装为不同策略,运行时动态切换:

class MovementStrategy {
public:
    virtual void move() const = 0;
};

class WalkStrategy : public MovementStrategy { /* 实现行走逻辑 */ };
class FlyStrategy : public MovementStrategy { /* 实现飞行逻辑 */ };

https://github.com/sean456665/bvw_594v
https://github.com/joshvfort/c3c_rtgd
https://github.com/tankiahabi/5jl_9iqo
https://github.com/taimoralis/6be_9uwh
https://github.com/dagababa/mz5_rqiv

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐