C++ QT设计模式:责任链模式

基本概念

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,将请求沿着处理链传递,直到有一个对象能够处理为止。

实现的模块有:

  • Handler(处理者):定义一个处理请求的接口。
  • ConcreteHandler(具体处理者):实现了处理者接口,判断自己是否能够处理请求,如果不能将请求传递给下一个处理者。
  • Request(请求):封装了请求的信息,通常作为处理者方法的参数传递。

使用场景

  • 当需要将请求的发送者和接收者进行解耦时。
  • 当有多个对象可以处理同一请求,但不确定哪个对象应该处理时。
  • 当需要动态指定处理请求的顺序时。

实现

QT源码:事件系统

QT的事件处理系统同样用到了事件处理系统,其中事件通过事件队列发送到对应的对象,每个对象都可以处理该事件,如果该对象无法处理,将会发给下一个对象。

以下是 QAppliaction 发送鼠标事件给 QWidget 的部分源码:

//接收鼠标事件的对象w
QWidget* w = static_cast<QWidget *>(receiver);
//鼠标事件e
QMouseEvent* mouse = static_cast<QMouseEvent*>(e);

......

while (w) {
    //创建一个新的鼠标事件对象,用于在对象树中传播鼠标事件
    QMouseEvent me(mouse->type(), relpos, mouse->windowPos(), mouse->globalPos(),
                   mouse->button(), mouse->buttons(), mouse->modifiers(), mouse->source());

......

    //如果鼠标事件被接受,打破循环
    eventAccepted = (w == receiver ? mouse : &me)->isAccepted();
    if (res && eventAccepted)
        break;

......

    //如果鼠标事件未被接受,将w设置为w的父组件,继续循环
    w = w->parentWidget();
}

可以看出, QApplication 将鼠标事件沿着对象树传递,直到有一个对象能够处理为止,符合责任链模式的思想,其中:

  • QObject:Handler(处理者),定义一个处理鼠标事件的接口。
  • QWidgt:ConcreteHandler(具体处理者),实现了 QObject 的接口,判断自己是否能够处理鼠标事件,如果不能将请求传递给父类 QWidget。
  • QMouseEvent:Request(请求),封装了鼠标事件的信息。
  • QAppliaction:客户端,是请求的发起者。

相关推荐

  1. 设计模式-责任模式

    2024-05-15 15:08:04       55 阅读
  2. 设计模式——责任模式

    2024-05-15 15:08:04       56 阅读
  3. 设计模式责任模式

    2024-05-15 15:08:04       33 阅读

最近更新

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

    2024-05-15 15:08:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

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

    2024-05-15 15:08:04       82 阅读
  4. Python语言-面向对象

    2024-05-15 15:08:04       91 阅读

热门阅读

  1. Linux基础知识面试题

    2024-05-15 15:08:04       26 阅读
  2. Auto.js 开发入门

    2024-05-15 15:08:04       29 阅读
  3. 数据库面试题(MySQL、Oracle)

    2024-05-15 15:08:04       30 阅读
  4. C++多态

    C++多态

    2024-05-15 15:08:04      27 阅读
  5. Python自动化测试实战:深入Page Object模式

    2024-05-15 15:08:04       35 阅读
  6. IT行业现状与未来趋势:洞察变革的浪潮

    2024-05-15 15:08:04       35 阅读
  7. 各种距离相似度量及计算

    2024-05-15 15:08:04       22 阅读