责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,其中多个对象按照其在链中的顺序依次处理请求,直到有一个对象处理请求为止。这样可以避免请求的发送者与接收者之间的耦合,同时使得多个对象都有机会处理请求。
下面是一个用QT框架和C++语言实现责任链模式的简单示例,假设我们有一个简单的报销审批流程,包括经理、副总裁和总裁三个级别的审批人员,根据报销金额的不同,不同级别的审批人员有不同的审批权限。
演示代码:
#include <QCoreApplication>
#include <QDebug>// 请求类
class Request {
public:Request(double amount) : m_amount(amount) {}double getAmount() const { return m_amount; }private:double m_amount;
};// 处理请求的抽象类
class Approver {
public:Approver(Approver* successor = nullptr) : m_successor(successor) {}virtual ~Approver() {}// 处理请求 纯虚函数virtual void processRequest(const Request& request) = 0;protected:Approver* m_successor;
};// 经理类
class Manager : public Approver {
public:void processRequest(const Request& request) override {if (request.getAmount() <= 1000) {qDebug() << "经理批准了该请求.";} else if (m_successor != nullptr) {m_successor->processRequest(request);}}
};// 副总裁类
class VicePresident : public Approver {
public:void processRequest(const Request& request) override {if (request.getAmount() <= 5000) {qDebug() << "副总裁批准了这一请求.";} else if (m_successor != nullptr) {m_successor->processRequest(request);}}
};// 总裁类
class President : public Approver {
public:void processRequest(const Request& request) override {if (request.getAmount() > 5000) {qDebug() << "总裁批准了这一请求.";} else {qDebug() << "请求无法批准.";}}
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 创建审批人员对象Approver* president = new President();Approver* vicePresident = new VicePresident(president);Approver* manager = new Manager(vicePresident);// 创建请求Request request1(800);Request request2(3500);Request request3(10000);// 处理请求manager->processRequest(request1);manager->processRequest(request2);manager->processRequest(request3);delete manager;delete vicePresident;delete president;return a.exec();
}
在这个示例中,经理、副总裁和总裁分别代表责任链中的不同处理者,根据报销金额的不同来判断是否能够处理请求或者交给下一个处理者。责任链模式可以动态地组织处理者对象的链,使得系统更加灵活和可扩展。
责任链模式是一种灵活且强大的设计模式,但也存在一些优点和缺点。以下是责任链模式的主要优缺点:
优点:
-
降低耦合度:责任链模式将请求发送者和接收者解耦,使得请求发送者无需知道具体的处理者,从而降低系统的耦合度。
-
灵活性:责任链模式允许动态地添加、移除或修改处理者,使得系统更加灵活,能够根据需求动态地调整处理流程。
-
可扩展性:由于责任链模式允许在运行时动态添加新的处理者,因此可以轻松地扩展系统的功能,而无需修改现有代码。
-
单一职责原则:每个处理者只需关注自己应该处理的请求,符合单一职责原则,使得系统更加清晰和易于维护。
缺点:
-
请求未被处理:责任链模式并不能保证每个请求一定会被处理,如果没有合适的处理者或者处理者链配置不当,请求可能会被忽略而无法得到处理。
-
性能问题:责任链模式可能导致请求在整个链中传递,直到找到合适的处理者。如果责任链过长或者处理者处理请求的时间过长,可能会影响系统的性能。
-
调试困难:责任链模式的链条可能比较复杂,当出现问题时,需要逐个追踪每个处理者的处理情况,增加了调试的难度。
-
可能导致循环引用:如果责任链配置不当,可能会导致处理者之间出现循环引用,使得请求在链中无法正常处理。
在使用责任链模式时,需要根据具体的场景和需求权衡其优缺点,确保能够充分发挥其优势,同时避免其潜在的缺点带来的问题。
