C++ 设计模式 策略模式
时间: 2023-07-24 07:31:27 浏览: 113
策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时动态选择算法的行为。
在C++中,可以通过以下步骤来实现策略模式:
1. 定义一个抽象基类(或接口),该类定义了所有具体策略类所需实现的公共接口。
2. 创建具体的策略类,它们实现了抽象基类中定义的接口,并提供了不同的算法实现。
3. 在需要使用策略的地方,创建一个上下文类,该类持有一个指向抽象基类的指针。上下文类提供了一个接口,用于设置和使用具体的策略对象。
4. 在运行时,根据需求选择合适的具体策略对象,并将其设置给上下文类。
5. 上下文类在需要执行算法时,调用具体策略对象的方法来完成相应的操作。
以下是一个简单的示例代码:
```cpp
// 策略接口
class Strategy {
public:
virtual void execute() = 0;
};
// 具体策略类A
class ConcreteStrategyA : public Strategy {
public:
void execute() override {
// 实现具体的算法A
}
};
// 具体策略类B
class ConcreteStrategyB : public Strategy {
public:
void execute() override {
// 实现具体的算法B
}
};
// 上下文类
class Context {
private:
Strategy* strategy; // 持有一个策略对象的指针
public:
void setStrategy(Strategy* strategy) {
this->strategy = strategy;
}
void executeStrategy() {
strategy->execute();
}
};
// 使用示例
int main() {
Context context;
ConcreteStrategyA strategyA;
context.setStrategy(&strategyA);
context.executeStrategy();
ConcreteStrategyB strategyB;
context.setStrategy(&strategyB);
context.executeStrategy();
return 0;
}
```
在上面的示例中,我们定义了一个策略接口 `Strategy`,并创建了两个具体的策略类 `ConcreteStrategyA` 和 `ConcreteStrategyB`。然后,我们创建了一个上下文类 `Context`,它持有一个指向策略接口的指针,并提供了设置和执行策略的方法。在 `main` 函数中,我们可以根据需要选择具体的策略对象,并通过上下文类来执行相应的算法。
这就是策略模式的基本实现方法。通过使用策略模式,我们可以将算法的实现与使用代码分离,使得代码更加灵活和可维护。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)