职责链模式
职责链模式是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之前的耦合关系。在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这条链上传递,直到链上的某一个对象决定处理此请求。
在公司中不同的岗位拥有不同的职责与权限。以上述的请假流程为例,当X请一天假的时候,只要组长审批就可以了,不需要流转到主管和总监。如果职责链上的某个环节无法处理当前的请求,若含有下个环节,则会把请求转交给下个环节来处理。
职责链上的处理负责处理请求,客户只需要将请求发送到职责链上即可,无需关心请求的处理细节和请求的传递,所有职责链将请求的发送者和请求的处理者解耦了。
在日常的软件开发过程中,对于职责链来说,一种常见的应用的场景是中间件,下面我们来看一下如何利用职责链处理请求。
#includeusing namespace std; eenum RequestLevel { Level_One = 0, Level_Two, Level_Three, Level_Num }; //抽象处理者(Handler)角色,提供职责链的统一接口 class Leader { public: Leader(Leader* leader):m_leader(leader){} virtual ~Leader(){} virtual void handleRequest(RequestLevel level) = 0; protected: Leader* m_leader; }; //具体处理者(Concrete Handler)角色 class Montior:public Leader //链扣1 { public: Monitor(Leader *leader):Leader(leader){} void handleRequest(RequestLevel level) { if(level < level_Two) { cout << "Mointor handle request : " << level << endl; } else { m_leader->handleRequest(level); } } }; //具体处理者(Concrete Handler)角色 class Captain:public Leader // { public: Captain(Leader* leader):leader(leader){} void hanleRequest(RequestLevel level) { if (level < Level_Three) { cout << "Captain handle request : " << level << endl; } else { m_leader->handleRequest(level); } } }; //具体处理者(Concrete Handle)角色 class General:public Leader { //链扣3 public: General(Leader* leader):Leader(leader){} void handleRequest(RequestLevel level) { cout << "General handle request : " << level << endl; } }; int main() { Leader* general = new General(nullptr); Leader* captain = new Captain(general); Leader* monitor = new Monitor(captain); monti->handleRequest(Level_One); delete monitor; monitor = nullptr; delete captain; captain = nullptr; delete general; general = nullptr; return 0; }



