一、责任链模式简介
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,也叫职责链模式或者职责连锁模式。用于处理请求的多个对象,以实现请求的分发和处理。它的核心思想是将请求的处理职责链式地传递给多个对象中的一个或多个,从而避免请求发送者和接收者之间的耦合。该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作责任链模式。责任链的形式在我们的日常工作和生活中处处可见。
责任链模式的结构图
主要组成部分
工作流程
责任链模式的应用场景
二、责任链模式的设计方法
chain.cpp
#include <iostream>
// 处理者接口
class Handler {
public:
virtual ~Handler() {}
virtual void setNext(Handler*) = 0;
virtual void handle(const std::string& request) = 0;
};
// 具体处理者:试驾车辆
class TestDriveHandler : public Handler {
public:
void setNext(Handler* next) override {
next_ = next;
}
void handle(const std::string& request) override {
if (request == "试驾车辆") {
std::cout << "这辆车试驾体验good nice!" << std::endl;
} else if (next_ != nullptr) {
next_->handle(request);
}
}
private:
Handler* next_;
};
// 具体处理者:交钱
class PaymentHandler : public Handler {
public:
void setNext(Handler* next) override {
next_ = next;
}
void handle(const std::string& request) override {
if (request == "交钱") {
std::cout << "您账户9999于某年某月某日入账亿亿宇宙币." << std::endl;
} else if (next_ != nullptr) {
next_->handle(request);
}
}
private:
Handler* next_;
};
// 具体处理者:签合同
class SignContractHandler : public Handler {
public:
void setNext(Handler* next) override {
next_ = next;
}
void handle(const std::string& request) override {
if (request == "签合同") {
std::cout << "什么年代了,还按手印啊,无语,手印按好了!" << std::endl;
} else if (next_ != nullptr) {
next_->handle(request);
}
}
private:
Handler* next_;
};
// 具体处理者:交接车钥匙
class HandoverKeyHandler : public Handler {
private:
Handler* next_;
public:
void setNext(Handler* next) override {
next_ = next;
}
void handle(const std::string& request) override {
if (request == "交接车钥匙") {
std::cout << "先生/女士,请拿好您的车钥匙" << std::endl;
} else if (next_ != nullptr) {
next_->handle(request);
}
}
};
void doWorking() {
// 设置处理链
Handler* testDrive = new TestDriveHandler;
Handler* payment = new PaymentHandler;
Handler* signContract = new SignContractHandler;
Handler* handoverKey = new HandoverKeyHandler;
testDrive->setNext(payment);
payment->setNext(signContract);
signContract->setNext(handoverKey);
// 客户请求
testDrive->handle("试驾车辆");
testDrive->handle("交钱");
testDrive->handle("签合同");
testDrive->handle("交接车钥匙");
// 释放资源
delete handoverKey;
delete signContract;
delete payment;
delete testDrive;
return ;
}
int main() {
doWorking();
return 0;
}
运行效果
三、总结
责任链模式中每一个类只需要负责自己的任务,不属于自己的任务则交给其他链上的类。链上的每一个类或组合类的相邻链之间由上一个链上的类触发下一个链上的类(抽象接口Handler帮忙)。多个链上的类组合一起最终完成一个被拆解的复杂的需求。