c++如何实现一个职责链设计模式_c++解耦请求发送者与接收者

职责链模式通过抽象基类Handler定义请求处理接口并持有后继者指针,具体子类如FileHandler根据条件决定处理或转发请求,形成链式调用结构,实现解耦。

在C++中实现职责链(Chain of Responsibility)设计模式,核心是将请求的发送者与接收者解耦,让多个对象都有机会处理请求,从而避免请求者与具体处理者之间的紧耦合。这种模式通常用于构建处理流程的“链条”,每个节点决定是处理请求还是传递给下一个节点。

定义抽象处理者(Handler)

首先定义一个抽象基类,声明处理请求的接口,并持有对下一个处理者的引用。

class Handler {
protected:
    Handler* next_;

public: Handler() : next_(nullptr) {}

virtual ~Handler() = default;

void setNext(Handler* next) {
    next_ = next;
}

virtual void handleRequest(const std::string& request) = 0;

protected: void passToNext(const std::string& request) { if (next) { next->handleRequest(request); } else { std::cout } } };

实现具体处理者(Concrete Handlers)

每个子类根据自身职责判断是否处理请求,否则转发给后继者。

class FileHandler : public Handler {
public:
    void handleRequest(const std::string& request) override {
        if (request == "open_file") {
            std::cout << "FileHandler: Opening file...\n";
        } else {
            passToNext(request);
        }
    }
};

class PrintHandler : public Handler { public: void handleRequest(const std::string& request) override { if (request == "print") { std::cout << "PrintHandler: Printing document...\n"; } else { passToNext(request); } } };

class SaveHandler : public Handler { public: void handleRequest(const std::string& request) override { if (request == "save") { std::cout << "SaveHandler: Saving file...\n"; } else { passToNext(request); } } };

使用职责链组织处理流程

客户端代码通过串联处理者对象形成链条,请求从链头开始传递。

int main() {
    FileHandler fileHandler;
    PrintHandler printHandler;
    SaveHandler saveHandler;
// 构建处理链
fileHandler.setNext(&printHandler);
printHandler.setNext(&saveHandler);

// 发送请求
fileHandler.handleRequest("open_file"); // 被 FileHandler 处理
fileHandler.handleRequest("print");     // 被 PrintHandler 处理
fileHandler.handleRequest("save");      // 被 SaveHandler 处理
fileHandler.handleRequest("exit");      // 无人处理

return 0;

}

通过这种方式,请求发送者只需知道链的第一个处理者,无需了解具体由谁处理。每个处理者只关注自己的职责范围,系统扩展性强——新增处理类型时,只需添加新类并接入链中,原有代码无需修改。

基本上就这些。职责链适合多级过滤、审批流程或事件处理系统,关键在于明确职责划分和传递逻辑。