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

发布于:2024-05-14 ⋅ 阅读:(88) ⋅ 点赞:(0)

基本概念

责任链模式(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:客户端,是请求的发起者。

网站公告

今日签到

点亮在社区的每一天
去签到