本文共 3711 字,大约阅读时间需要 12 分钟。
对于一个企业来说,每天难免的要收到大量的信息,有求职者发送过来的简历、其他公司的商务合作信息、又或者是和一些企业或客户的法律纠纷信息、又或者是一些广告、推销信息。面对这大量的信息,处理起来十分的麻烦。
于是企业准备开发一套信息管理系统,初步的设计如下
但是,这样的设计存在着严重的问题。
随着我们公司的规模不断扩张,各个部门的职责也更加细化,对于这些信息,我们又新增了几个新部门进行处理,同时我们可能又会对业务细化,将一个部门拆分成多个部门。甚至我们又会对信息进行分级,例如普通信息管理者,机密信息管理者等等
在这种情况下,管理者存在着大量的职责,违反了单一职责原则。同时,我们每一次增加、修改部门时,都需要去修改管理者的内部实现,这同时又违反了开放-封闭原则,这样的代码不仅维护性差,类与类之间也存在着强耦合的关系,是个不好的设计方案。
为了解决这个问题,就引入了职责链模式
职责链模式使得多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止
职责链模式由两部分组成
类图如下
根据职责链模式,此时我们的关系是这样的,我们让部门之间以链表的形式连接起来。
例如客户发送来一个XXX的求职简历,此时的处理流程是这样的
下面就以代码的形式实现一下这个功能
首先实现一个请求的结构,以及处理者的抽象类,其中为了实现链式结构,处理者中保留了一个指向职责链下一个处理者的指针
//请求结构体,包含请求类型和正文struct Request{ std::string _type; std::string _text;};//处理者抽象类,所有的具体处理者都会继承并实现该类class Handler{ public: Handler() : _sussessor(nullptr) { } virtual ~Handler() = default; void setSussessor(Handler* sussessor) { _sussessor = sussessor; } virtual void HandlerRequest(const Request& req) = 0; protected: Handler* _sussessor; //继任者};
接着实现具体的处理者
#include"Handler.hpp"#include//法务部门class LegalHandler : public Handler{ public: void HandlerRequest(const Request& req) override { if(req._type == "法务信息") { std::cout << "法务部门处理法务信息: " << req._text << std::endl; } else { if(_sussessor != nullptr) { _sussessor->HandlerRequest(req); } } }};//商务部门class BusinessHandler : public Handler{ public: void HandlerRequest(const Request& req) override { if(req._type == "商务信息") { std::cout << "商务部门处理商务信息: " << req._text << std::endl; } else { if(_sussessor != nullptr) { _sussessor->HandlerRequest(req); } } }};//人事部门class PersonnelHandler : public Handler{ public: void HandlerRequest(const Request& req) override { if(req._type == "人事信息") { std::cout << "人事部门处理人事信息: " << req._text << std::endl; } else { if(_sussessor != nullptr) { _sussessor->HandlerRequest(req); } } }};//杂务部门,也相当于是收尾人,负责处理剩余的请求class MiscellaneousHandler : public Handler{ public: void HandlerRequest(const Request& req) override { std::cout << "杂务部门处理剩余信息: " << req._text << std::endl; }};
测试代码
int main(){ Handler* legal = new LegalHandler; Handler* business = new BusinessHandler; Handler* personnel = new PersonnelHandler; Handler* miscellaneous = new MiscellaneousHandler; legal->setSussessor(business); business->setSussessor(personnel); personnel->setSussessor(miscellaneous); legal->HandlerRequest({ "法务信息", "XXX法院传票"}); legal->HandlerRequest({ "商务信息", "XXX商业合作"}); legal->HandlerRequest({ "人事信息", "XXX投递简历"}); legal->HandlerRequest({ "杂务信息", "XXX无关信息"}); delete legal, business, personnel, miscellaneous;}
在当前的设计中,客户只需要将所有的信息发送给职责链的首部即可,如果他能够处理则直接完成请求,如果无法完成就会将请求转发给职责链的下一个处理者继续执行
要点
应用场景
如果有需要完整代码或者markdown文档的同学可以点击下面的github链接
转载地址:http://hdmsz.baihongyu.com/