策略模式概念
策略模式是一种行为设计模式,它允许定义一系列算法,并将每个算法封装到一个对象中。这些算法对象可以相互替换,使得客户端调用算法的代码与具体算法的实现分离。在C++中,策略模式通常由一个接口类、具体策略类、上下文类和客户端代码组成。
下面是一个使用C++实现策略模式的示例代码:
#include <iostream>
#include <memory>
#include <string>
#include <algorithm>
// 策略接口类
class Strategy {
public:
virtual void doAlgorithm(std::string& data) = 0;
virtual ~Strategy() {}
};
// 具体策略类A
class ConcreteStrategyA : public Strategy {
public:
void doAlgorithm(std::string& data) override {
std::sort(data.begin(), data.end());
std::cout << "ConcreteStrategyA: " << data << std::endl;
}
};
// 具体策略类B
class ConcreteStrategyB : public Strategy {
public:
void doAlgorithm(std::string& data) override {
std::sort(data.begin(), data.end(), std::greater<>());
std::cout << "ConcreteStrategyB: " << data << std::endl;
}
};
// 上下文类
class Context {
private:
std::unique_ptr<Strategy> strategy_;
public:
void setStrategy(std::unique_ptr<Strategy> strategy) {
strategy_ = std::move(strategy);
}
void executeStrategy(std::string& data) {
if (strategy_) {
strategy_->doAlgorithm(data);
}
}
};
// 客户端代码
int main() {
Context context;
std::string data = "aecbd";
std::unique_ptr<Strategy> strategyA = std::make_unique<ConcreteStrategyA>();
context.setStrategy(std::move(strategyA));
context.executeStrategy(data);
std::unique_ptr<Strategy> strategyB = std::make_unique<ConcreteStrategyB>();
context.setStrategy(std::move(strategyB));
context.executeStrategy(data);
return 0;
}
在这个示例中,我们定义了一个策略接口类Strategy
,并实现了两个具体的策略类ConcreteStrategyA
和ConcreteStrategyB
。上下文类Context
持有一个策略对象,并在客户端代码中可以动态地切换不同的策略来执行算法。
这个示例展示了策略模式的核心思想,即将算法的实现与调用代码分离,使得算法可以独立变化,而不影响客户端代码。
使用场景
在实际开发中,策略模式通常在以下情况下被选择使用:
-
多算法选择:当一个系统需要在运行时动态地选择算法时,策略模式非常有用。例如,一个排序算法可以根据用户的选择来进行升序排序、降序排序或其他定制排序。
-
减少条件语句:策略模式可以帮助减少大量的条件语句。如果一个系统中存在大量的条件判断,可以使用策略模式将不同的条件分支封装到不同的策略类中,从而使代码更加清晰和易于维护。
-
算法的独立性:当需要将算法的实现与调用代码分离,使得算法可以独立变化时,策略模式非常适用。这样可以使得系统更加灵活,易于扩展和维护。
-
测试和复用:策略模式可以帮助提高代码的可测试性和可复用性。每个策略类都可以独立进行单元测试,并且可以在不同的上下文中被复用。
总之,策略模式适用于需要在运行时动态选择算法、减少条件语句、提高代码的灵活性和可维护性的情况下。
标签:std,策略,--,模式,strategy,算法,设计模式,data From: https://www.cnblogs.com/yubo-guan/p/17965819