策略模式:动态切换算法的艺术,线程清理机制(pthread_cleanup函数族实践)。
·
策略模式的核心思想
策略模式属于行为型设计模式,允许在运行时选择算法的具体实现。其核心是将算法族封装为独立类,使它们可以互相替换,且算法的变化不影响使用算法的客户端。
模式结构
- 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
更多推荐



所有评论(0)