[设计模式] --- 策略模式

简介: [设计模式] --- 策略模式

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 方法,读取相应传感器的数据。

通过这个示例,我们可以看到策略模式可以很好地解耦传感器数据读取的执行逻辑和具体的传感器实现。此外,通过策略模式,我们还可以在不修改多传感器服务上下文类的情况下,增加或替换传感器策略类。例如,如果需要增加一个气压传感器,只需要实现一个新的气压传感器策略类,并将它添加到策略对象集合中即可,而不需要修改多传感器服务上下文类的代码。


相关文章
|
28天前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
45 4
|
3月前
|
设计模式 算法 测试技术
PHP中的设计模式:策略模式的应用与实践
在软件开发的浩瀚海洋中,设计模式如同灯塔,指引着开发者们避开重复造轮子的暗礁,驶向高效、可维护的代码彼岸。今天,我们将聚焦于PHP领域中的一种重要设计模式——策略模式,探讨其原理、应用及最佳实践,揭示如何通过策略模式赋予PHP应用灵活多变的业务逻辑处理能力,让代码之美在策略的变换中熠熠生辉。
|
19天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
38 1
|
22天前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
27 2
|
1月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
43 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
36 3
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
32 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
65 3
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
28 3
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
35 1