设计模式—职责链模式(将要求提交给小领导,每个人都有一个顶头上司,直到有人能处理为止)

    科技2024-06-04  59

    职责连模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系

    将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

    就拿雇员向领导提出请假和加薪的要求,不同的领导的权限不一样来向上级请示为例子:

    #ifndef MANAGER_H #define MANAGER_H #include <QString> #include <QSharedPointer> #include <QDebug> class Request { public: QString getRequestType() const {return _requestType;} void setRequestType(QString requestType){_requestType = requestType;} QString getRequestContent() const {return _requestContent;} void setRequestContent(QString requestContent){_requestContent = requestContent;} int getNumber() const {return _number;} void setNumber(int number){_number = number;} private: QString _requestType; QString _requestContent; int _number; }; class Manager { public: explicit Manager(QString name) { _name = name; } void setSuperior(Manager* superior) { _superior = QSharedPointer<Manager>(superior); } virtual void RequestApplications(const Request &) = 0; virtual ~Manager(){} protected: QString _name; QSharedPointer<Manager> _superior; }; class CommonManager final : public Manager //经理类 { public: explicit CommonManager(QString name):Manager(name){} void RequestApplications(const Request & request) override //注意,函数的参数如果有const实例,则函数里面调用该实例的方法必须是const函数 { if(request.getRequestType() == "请假" && request.getNumber()<=2) { qDebug()<<_name<<request.getRequestContent()<<request.getNumber()<<"被批准"; } else { if(_superior!=nullptr) _superior->RequestApplications(request); } } }; class Majordomo final : public Manager //总监类 { public: explicit Majordomo(QString name):Manager(name){} void RequestApplications(const Request & request) override { if(request.getRequestType() == "请假" && request.getNumber()<=5) { qDebug()<<_name<<request.getRequestContent()<<request.getNumber()<<"被批准"; } else { if(_superior!=nullptr) _superior->RequestApplications(request); } } }; class GeneralManager final : public Manager //总经理类 { public: explicit GeneralManager(QString name):Manager(name){} void RequestApplications(const Request & request) override { if(request.getRequestType() == "请假" && request.getNumber()<=500) { qDebug()<<_name<<request.getRequestContent()<<request.getNumber()<<"被批准"; } else if(request.getRequestType() == "加薪" && request.getNumber()<=500) { qDebug()<<_name<<request.getRequestContent()<<request.getNumber()<<"被批准"; } else if(request.getRequestType() == "加薪" && request.getNumber()>500) { qDebug()<<_name<<request.getRequestContent()<<request.getNumber()<<"再说吧"; } } }; #endif // MANAGER_H  

    有了管理者和各个管理者的子类,就可以实现main函数的例子了:

    #include "manager.h" int main() { CommonManager* jinli = new CommonManager("金利"); Majordomo* zongjian = new Majordomo("宗剑"); GeneralManager* zhongjingli = new GeneralManager("钟精励"); jinli->setSuperior(zongjian); zongjian->setSuperior(zhongjingli); Request* request = new Request(); request->setRequestType("请假"); request->setRequestContent("小菜请假"); request->setNumber(1); jinli->RequestApplications(*request); Request* request2 = new Request(); request2->setRequestType("请假"); request2->setRequestContent("小菜请假"); request2->setNumber(4); jinli->RequestApplications(*request2); Request* request3 = new Request(); request3->setRequestType("加薪"); request3->setRequestContent("小菜请求加薪"); request3->setNumber(500); jinli->RequestApplications(*request3); Request* request4 = new Request(); request4->setRequestType("加薪"); request4->setRequestContent("小菜请求加薪"); request4->setNumber(1000); jinli->RequestApplications(*request4); return 0; }

    由代码可以看出,职责链模式将一个管理者类抽象出来,然后扩展为三个具体的类(经理类、总监类和总经理类),这样类的灵活性就大大增加!如果我们需要扩展新的管理者,只需要增加子类即可,真的是非常灵活方便!

    最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/SalaryRaise_ResponsibilityEven_mode_24

    Processed: 0.013, SQL: 8