Chain Responsibility Pattern

Chain Responsibility Pattern

1. Allows a request to be passed along the chain of handlers until it is processed.

2. used in Qt

2.1 Qt Event loop

2.2 Qt Event Loop Call Stack, using a mouse click as an example.

复制代码
QWidgetWindow::handleMouseEvent
 
QWidget * QApplicationPrivate::pickMouseReceiver
 
QApplication::notify(QObject *receiver, QEvent *e)
 
while (w) {
 
 res = d->notify_helper(...);
 
 w = w->parentWidget();
 
}
 
QApplicationPrivate::notify_helper(QObject *receiver, QEvent * e)
 
QWidget::event(event);

3. example

3.1 Handler
复制代码
#include <iostream>
#include <memory>
#include <string>

// 抽象处理者类
class Handler {
public:
    virtual ~Handler() = default;
    
    // 设置下一个处理者
    void setNext(std::shared_ptr<Handler> next) {
        nextHandler = next;
    }

    // 处理请求
    virtual void handleRequest(const std::string& request) = 0;

protected:
    std::shared_ptr<Handler> nextHandler;
};

3.2 ConcreteHandler

复制代码
// 具体处理者1
class ConcreteHandlerA : public Handler {
public:
    void handleRequest(const std::string& request) override {
        if (request == "A") {
            std::cout << "Handler A is handling the request." << std::endl;
        } else if (nextHandler) {
            nextHandler->handleRequest(request);
        } else {
            std::cout << "Request not handled." << std::endl;
        }
    }
};

// 具体处理者2
class ConcreteHandlerB : public Handler {
public:
    void handleRequest(const std::string& request) override {
        if (request == "B") {
            std::cout << "Handler B is handling the request." << std::endl;
        } else if (nextHandler) {
            nextHandler->handleRequest(request);
        } else {
            std::cout << "Request not handled." << std::endl;
        }
    }
};

// 具体处理者3
class ConcreteHandlerC : public Handler {
public:
    void handleRequest(const std::string& request) override {
        if (request == "C") {
            std::cout << "Handler C is handling the request." << std::endl;
        } else if (nextHandler) {
            nextHandler->handleRequest(request);
        } else {
            std::cout << "Request not handled." << std::endl;
        }
    }
};

3.3 main

复制代码
int main() {
    // 创建具体的处理者
    std::shared_ptr<Handler> handlerA = std::make_shared<ConcreteHandlerA>();
    std::shared_ptr<Handler> handlerB = std::make_shared<ConcreteHandlerB>();
    std::shared_ptr<Handler> handlerC = std::make_shared<ConcreteHandlerC>();

    // 设置责任链
    handlerA->setNext(handlerB);
    handlerB->setNext(handlerC);

    // 发起请求
    std::cout << "Sending request A:" << std::endl;
    handlerA->handleRequest("A");

    std::cout << "\nSending request B:" << std::endl;
    handlerA->handleRequest("B");

    std::cout << "\nSending request C:" << std::endl;
    handlerA->handleRequest("C");

    std::cout << "\nSending request D:" << std::endl;
    handlerA->handleRequest("D");

    return 0;
}

3.4 result

复制代码
Sending request A:
Handler A is handling the request.

Sending request B:
Handler B is handling the request.

Sending request C:
Handler C is handling the request.

Sending request D:
Request not handled.
相关推荐
小码过河.9 小时前
设计模式——责任链模式
设计模式·责任链模式
Engineer邓祥浩3 天前
设计模式学习(25) 23-23 责任链模式
学习·设计模式·责任链模式
虫小宝15 天前
基于责任链模式构建可扩展的微信群发消息风控过滤器(Java实现)
android·java·责任链模式
Knight_AL15 天前
设计模式之责任链模式:原理解析 + Java 示例
java·设计模式·责任链模式
Geoking.16 天前
【设计模式】责任链模式(Chain of Responsibility)详解
java·设计模式·责任链模式
Knight_AL16 天前
Spring Boot 中优雅地使用责任链模式(@Order 实战)
windows·spring boot·责任链模式
我是小疯子6618 天前
深入解析Rocket框架的FromRequest与责任链模式
责任链模式
__万波__23 天前
二十三种设计模式(二十三)--责任链模式
java·设计模式·责任链模式
罗小爬EX1 个月前
杂记 - 状态模式 VS. 责任链模式
状态模式·责任链模式