1 策略模式简介
策略模式是一种行为型设计模式,它可以根据不同的情况选择不同的算法实现。它通常适用于以下场景:
当需要在运行时根据某些条件选择不同的算法时,可以使用策略模式。这种情况下,策略模式可以避免使用大量的 if-else 语句。
当需要封装一组算法,并且可以相互替换时,可以使用策略模式。这样可以使得算法的变化独立于使用算法的客户端。
当类中包含大量条件语句时,可以使用策略模式将条件语句封装在具体的策略类中,以增加代码的可维护性。
当需要动态地切换算法时,可以使用策略模式。这种情况下,可以通过简单地切换策略对象来改变算法的行为。
总之,策略模式适用于需要在运行时动态地选择算法实现的场景,可以减少代码的复杂度和维护成本,并提高代码的可扩展性和可复用性。
2 策略模式简单示例
#include <iostream> // 策略接口 class Strategy { public: virtual void execute() = 0; }; // 具体策略A class ConcreteStrategyA : public Strategy { public: void execute() { std::cout << "Executing strategy A" << std::endl; } }; // 具体策略B class ConcreteStrategyB : public Strategy { public: void execute() { std::cout << "Executing strategy B" << std::endl; } }; // 策略上下文 class Context { private: Strategy* strategy; public: Context(Strategy* s) : strategy(s) {} void setStrategy(Strategy* s) { strategy = s; } void executeStrategy() { strategy->execute(); } }; // 使用策略模式 int main() { Strategy* strategyA = new ConcreteStrategyA(); Strategy* strategyB = new ConcreteStrategyB(); Context* context = new Context(strategyA); context->executeStrategy(); context->setStrategy(strategyB); context->executeStrategy(); delete context; delete strategyA; delete strategyB; return 0; }
运行结果
Executing strategy A Executing strategy B
在上面的代码中,我们首先定义了一个策略接口 Strategy,它包含一个纯虚函数 execute,这个函数表示具体策略要执行的操作。
接着,我们定义了两个具体的策略类 ConcreteStrategyA 和 ConcreteStrategyB,它们分别实现了 Strategy 接口中的 execute 函数。
然后,我们定义了一个策略上下文类 Context,它包含一个指向 Strategy 对象的指针 strategy,并提供了一系列操作来设置策略对象和执行策略对象的操作。
最后,在 main 函数中,我们创建了两个具体的策略对象 strategyA 和 strategyB,然后分别使用它们来创建一个策略上下文对象 context,并执行其中的策略对象。
3 多传感器业务场景策略模式使用示例
#include <iostream> #include <string> #include <vector> // 策略接口 class SensorStrategy { public: virtual void readData() = 0; }; // 温度传感器策略实现类 class TemperatureSensorStrategy : public SensorStrategy { public: void readData() override { std::cout << "读取温度传感器数据..." << std::endl; } }; // 湿度传感器策略实现类 class HumiditySensorStrategy : public SensorStrategy { public: void readData() override { std::cout << "读取湿度传感器数据..." << std::endl; } }; // 光照传感器策略实现类 class LightSensorStrategy : public SensorStrategy { public: void readData() override { std::cout << "读取光照传感器数据..." << std::endl; } }; // 多传感器服务上下文 class SensorServiceContext { public: SensorServiceContext(std::vector<SensorStrategy*> strategies) : m_strategies(strategies) {} // 执行服务 void executeService() { for (auto strategy : m_strategies) { strategy->readData(); } } private: std::vector<SensorStrategy*> m_strategies; }; // 多传感器业务场景 int main() { // 创建多传感器服务上下文对象 std::vector<SensorStrategy*> strategies; strategies.push_back(new TemperatureSensorStrategy()); strategies.push_back(new HumiditySensorStrategy()); strategies.push_back(new LightSensorStrategy()); SensorServiceContext context(strategies); // 执行多传感器服务 context.executeService(); // 释放资源 for (auto strategy : strategies) { delete strategy; } return 0;
执行结果
读取温度传感器数据... 读取湿度传感器数据... 读取光照传感器数据...
在这个示例中,多传感器服务上下文类 SensorServiceContext 封装了执行服务的逻辑,它通过设置不同的策略对象集合来实现读取不同传感器的数据。每个传感器对应一个策略类,包括温度传感器、湿度传感器和光照传感器。这些策略类实现了 SensorStrategy 接口中的 readData 方法,用于读取相应传感器的数据。
在程序中,首先创建一个多传感器服务上下文对象。然后,创建温度传感器、湿度传感器和光照传感器策略对象,并将它们添加到一个策略对象集合中,并将该集合设置为多传感器服务上下文对象的策略。最后,执行服务时,多传感器服务上下文对象将遍历策略对象集合,调用每个策略对象的 readData 方法,读取相应传感器的数据。
通过这个示例,我们可以看到策略模式可以很好地解耦传感器数据读取的执行逻辑和具体的传感器实现。此外,通过策略模式,我们还可以在不修改多传感器服务上下文类的情况下,增加或替换传感器策略类。例如,如果需要增加一个气压传感器,只需要实现一个新的气压传感器策略类,并将它添加到策略对象集合中即可,而不需要修改多传感器服务上下文类的代码。