链接:C++ 设计模式
链接:C++ 设计模式 - 模板方法
链接:C++ 设计模式 - 观察者模式
策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式使得算法可以独立于使用它的客户端而变化。
1.问题分析
在开发中,经常会遇到需要在运行时选择不同算法或行为的情况。如果将这些算法直接嵌入到客户端代码中,会导致代码复杂且难以维护。策略模式通过将算法封装成独立的类,并通过接口进行调用,使得算法可以灵活地替换和扩展。
2.实现步骤
- 定义策略接口:定义一个接口,所有具体策略类都实现这个接口。
- 实现具体策略类:每个具体策略类实现策略接口,提供具体的算法实现。
- 上下文类:上下文类持有一个策略对象的引用,并通过策略接口调用具体的算法。
3.代码示例
以机器人的清洁任务作为示例。
3.1.策略接口
cpp
// 定义机器人任务的公共接口
class CleaningStrategy {
public:
virtual ~CleaningStrategy() = default;
virtual void clean() = 0;
};
3.2.具体策略类
cpp
// 策略1,直线清洁
class LinearCleaningStrategy : public CleaningStrategy {
public:
void clean() override { std::cout << "Cleaning in a straight line." << std::endl; }
};
cpp
// 策略2,螺旋清洁
class SpiralCleaningStrategy : public CleaningStrategy {
public:
void clean() override { std::cout << "Cleaning in a spiral pattern." << std::endl; }
};
3.3.上下文类
cpp
// 维护一个对策略对象的引用
class CleaningRobot {
public:
void setStrategy(std::shared_ptr<CleaningStrategy> strategy) { this->strategy = strategy; }
void performCleaning() {
if (strategy) {
strategy->clean();
} else {
std::cout << "No cleaning strategy set." << std::endl;
}
}
private:
std::shared_ptr<CleaningStrategy> strategy;
};
3.4.调用算法
cpp
int main() {
// 创建一个清洁机器人对象
CleaningRobot robot;
// 设置直线清洁策略
std::shared_ptr<CleaningStrategy> linearStrategy = std::make_shared<LinearCleaningStrategy>();
robot.setStrategy(linearStrategy);
robot.performCleaning();
// 设置螺旋清洁策略
std::shared_ptr<CleaningStrategy> spiralStrategy = std::make_shared<SpiralCleaningStrategy>();
robot.setStrategy(spiralStrategy);
robot.performCleaning();
return 0;
}