当前位置: 首页 > article >正文

策略模式(C++)三分钟读懂

策略模式(Strategy Pattern)是一种面向对象编程的一种行为型设计模式,它允许在运行时动态地改变算法或策略的选择,从而使算法的变化独立于使用它的客户端。这种模式通过将算法封装在单独的类中,使得它们可以相互替换,并使得它们易于理解、扩展和维护。

多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如 if…else 语句、switch…case 语句。

下面用QT框架下C++演示一下

演示代码:

#include <iostream>
#include <QString>
#include <QDebug>

// 策略接口
class SortStrategy {
public:
    virtual void sort(QStringList &list) = 0;
};

// 具体策略A:按照字符串长度排序
class LengthSortStrategy : public SortStrategy {
public:
    void sort(QStringList &list) override {
        list.sort([](const QString &s1, const QString &s2) {
            return s1.length() < s2.length();
        });
    }
};

// 具体策略B:按照字母顺序排序
class AlphabeticalSortStrategy : public SortStrategy {
public:
    void sort(QStringList &list) override {
        list.sort();
    }
};

// 上下文类,用于执行策略
class SortContext {
private:
    SortStrategy *strategy;

public:
    SortContext(SortStrategy *strategy) : strategy(strategy) {}

    void setStrategy(SortStrategy *strategy) {
        this->strategy = strategy;
    }

    void executeStrategy(QStringList &list) {
        strategy->sort(list);
    }
};

int main() {
    QStringList list = {"apple", "banana", "grape", "orange"};

    // 使用策略A:按照字符串长度排序
    SortStrategy *lengthSortStrategy = new LengthSortStrategy();
    SortContext context(lengthSortStrategy);
    context.executeStrategy(list);

    qDebug() << "按照字符串长度排序:";
    for (const QString &item : list) {
        qDebug() << item;
    }

    // 使用策略B:按照字母顺序排序
    SortStrategy *alphaSortStrategy = new AlphabeticalSortStrategy();
    context.setStrategy(alphaSortStrategy);
    context.executeStrategy(list);

    qDebug() << "按照字母顺序排序:";
    for (const QString &item : list) {
        qDebug() << item;
    }

    delete lengthSortStrategy;
    delete alphaSortStrategy;

    return 0;
}

优点:

  1. 灵活性:策略模式可以使算法独立于使用它的客户端而变化,客户端可以在运行时选择合适的算法,动态改变对象的行为,从而提高系统的灵活性。

  2. 可扩展性:通过策略模式,可以很容易地新增新的算法,而无需修改现有代码。这符合开闭原则,使系统更易于扩展。

  3. 代码复用:策略模式可以使相似的算法封装在不同的策略类中,从而提高代码的复用性。

  4. 减少条件分支:策略模式可以减少大量的条件分支语句,使代码更清晰、简洁,易于维护。

  5. 单一职责原则:策略模式使得每个算法都有自己的类,符合单一职责原则,提高了代码的可读性和可维护性。

缺点:

  1. 类数量增多:使用策略模式会增加类的数量,特别是当策略类数量较多时,可能会导致类的膨胀,使得系统变得复杂。

  2. 客户端必须了解所有的策略:客户端需要了解所有的策略类,以便在运行时选择合适的策略,这可能会增加客户端的复杂性。

  3. 可能引入过多的细粒度策略类:如果策略类设计不当,可能会引入过多的细粒度策略类,导致系统过度复杂。

尽管策略模式存在一些缺点,但在很多情况下,其优点远大于缺点,特别是在需要动态改变对象行为、减少条件分支、提高系统灵活性和可扩展性等方面,策略模式仍然是一种非常有价值的设计模式。


http://www.kler.cn/a/379720.html

相关文章:

  • 数据库操作(php+mysql)
  • 考研要求掌握的C语言程度(插入排序)
  • 【设计模式系列】组合模式(十二)
  • 每周算法比赛
  • WPF使用Prism框架首页界面
  • [vulnhub]DC: 1
  • Naive UI 选择器 Select 的:render-option怎么使用(Vue3 + TS)(鼠标悬停该条数据的时候展示全部内容)
  • Java项目实战II基于Java+Spring Boot+MySQL的编程训练系统(源码+数据库+文档)
  • Windows密码的网络认证---基于挑战响应认证的NTLM协议
  • asynDriver-6-端口驱动
  • MQTT自动发送消息工具(自动化测试MQTT)
  • R语言贝叶斯:INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析
  • 黑马官网最新2024前端就业课V8.5笔记---CSS篇(2)
  • 家常菜点餐|基于java和小程序的家庭大厨家常菜点餐系统设计与实现(源码+数据库+文档)
  • Socket篇(网络通信)
  • SQL与数据库
  • C++设计模式结构型模式———组合模式
  • 【系统架构设计师】2022年真题论文: 论区块链技术及应用(包括解题思路和素材)
  • Vue:模板 MVVM
  • 为什么说高级工程师研究的不仅是器件的稳态,模拟器件的开关过程
  • PostgreSQL 触发器的深入探讨
  • 【高等数学】3-2多元函数积分学
  • flutter 专题七 Flutter面试之渲染流程
  • 硬件在环仿真建模之电路拓扑建模与数学建模
  • java-智能识别车牌号_基于spring ai和开源国产大模型_qwen vl
  • oceanbase V4.2.2社区版集群离线部署