C++ QT设计模式:中介者模式

基本概念

中介者模式(Mediator Pattern)是一种行为型设计模式,它允许你减少对象之间的直接通信,将它们的交互封装在一个中介对象中,从而降低了对象之间的耦合度。

中介者模式是将对象之间的通信转移到一个中介对象中,使得对象之间不需要直接相互引用,而是通过中介者进行通信。这样做可以简化对象之间的关系,使得系统更加灵活和可维护。

实现的模块有:

  • Mediator(中介者):定义了一个接口,用于与各个同事对象进行通信。

  • ConcreteMediator(具体中介者):实现了中介者接口,负责实际的中介逻辑。

  • Colleague(同事):定义了一个接口,用于与中介者进行通信。同事对象之间不直接通信。

  • ConcreteColleague(具体同事):实现了同事接口,负责实际的业务逻辑。

使用场景

  • 系统中的对象之间存在复杂的相互依赖关系,需要减少耦合度时。
  • 当一个对象的行为依赖于其他多个对象时。
  • 当一个对象的改变需要影响到其他多个对象时。

实现

QT源码:事件系统

QT的事件系统中也体现了中介者模式,来看一个默认的 mainwindow 程序的 main 函数。

int main(int argc, char *argv[])
{
    //QT的核心,负责事件分发
    QApplication a(argc, argv);
    
    //mainwindow对象
    MainWindow w;
    w.show();
    
    //开启事件循环,进行事件接收和处理
    return a.exec();
}

在这个函数中, QApplication 类通过 exec() 函数开启一个事件循环,开始检查事件队列,并将事件发送到各个部件(在这里是 MainWindow)。

那么,各个部件是怎么把事件发送到队列中的呢?通过研究源码,我找到了事件队列类 QPostEventList 和 QObject 类的私有成员函数 QObjectPrivate :

//给事件队列添加事件
void QPostEventList::addEvent(const QPostEvent &ev)

//调用addEvent,包含了将当前线程中的事件移动到目标线程的逻辑
void QObjectPrivate::setThreadData_helper(QThreadData *currentData, QThreadData *targetData)

也就是说,QObject 通过 QObjectPrivate::setThreadData_helper 来把事件发送到队列中。

再查看事件分发的函数:

bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)
void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority)
void QCoreApplication::sendPostedEvents(QObject *receiver = Q_NULLPTR, int event_type = 0)

可以得知能够接收事件的是 QObject 的子类,那么在这里:

  • QCoreApplication:Mediator(中介者):定义了一个事件分发的接口。
  • QApplication:ConcreteMediator(具体中介者),实现了实际的中介逻辑,在各种事件中进行事件分发。
  • QObject:Colleague(同事):定义了一个 QObject::event() 接口,可以接收事件,并且在QObjectPrivate::setThreadData_helper 中把事件发送到事件队列,用于与中介者进行通信。
  • MainWindow:ConcreteColleague(具体同事),实现了具体的 QObject::event() 接口,即实际的事件处理,以及实现具体的事件分发。

相关推荐

  1. 设计模式——中介模式

    2024-05-13 22:52:08       54 阅读
  2. 设计模式-中介模式

    2024-05-13 22:52:08       55 阅读
  3. 设计模式中介模式

    2024-05-13 22:52:08       32 阅读
  4. 设计模式中介模式

    2024-05-13 22:52:08       35 阅读
  5. 设计模式-中介模式

    2024-05-13 22:52:08       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-13 22:52:08       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-13 22:52:08       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-13 22:52:08       82 阅读
  4. Python语言-面向对象

    2024-05-13 22:52:08       91 阅读

热门阅读

  1. 算法学习笔记(二分图染色)

    2024-05-13 22:52:08       43 阅读
  2. 第21篇 jsp指令

    2024-05-13 22:52:08       37 阅读
  3. 大佬代码中的js

    2024-05-13 22:52:08       24 阅读
  4. 模板方法模式

    2024-05-13 22:52:08       36 阅读
  5. Flutter 中的 TextField 小部件:全面指南

    2024-05-13 22:52:08       27 阅读
  6. 深度伪造音频普遍检测的Codecfake数据集和对策

    2024-05-13 22:52:08       37 阅读
  7. 代码随想录刷题记录7——力扣206,24,19题

    2024-05-13 22:52:08       32 阅读
  8. 格式化容量或速度

    2024-05-13 22:52:08       30 阅读
  9. tp8 设置空控制器和空方法

    2024-05-13 22:52:08       26 阅读
  10. NeoVim配置文件基本的

    2024-05-13 22:52:08       28 阅读
  11. spring boot常用的filter

    2024-05-13 22:52:08       28 阅读