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