设计模式之职责链模式

来源:互联网 发布:无线路由器mac绑定 编辑:程序博客网 时间:2024/06/05 04:35

职责链模式

注意:

比较长的方法,多条的分支,这些其实都是代码的坏味道。

1. 职责链模式:

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

2. 职责链模式:


Handler,定义一个处理请示的接口。

ConcreteHandler,具体处理者类,处理它所负责的请求,可访问它的后继者,如果可处理该请求,就处理,否则就将该请求转发给它的后继者。

好处:

当客户提交一个请求,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。

可以随时的增加或修改处理一个请求的机构。增强了给对象指派职责的灵活性。

 

也要当心一个请求可能到了链的末端也得不到处理,或者因为没有正确配置而得不到处理。

3. 职责链模式的例子:


#include<iostream>#include <string>using namespace std;class Request{public:string requestType;string requestContent;int number;};class Manager//Handler{protected:string name;Manager *superior;//上级public:Manager(string name){this->name=name;}//设置管理者的上级void setSuperior(Manager *superior)//设置继任者{this->superior=superior;}virtual void requestApplications(Request *request)=0;};class CommonManager:public Manager{public:CommonManager(string name):Manager(name){}//经理的权限就是能批准2天内的假期,其余的就要转到上级void requestApplications(Request *request){if(request->requestType=="请假" && request->number<=2){cout<<name<<" "<<request->requestContent<<" 数量: "<<request->number<<"被批准"<<endl;}else {if(superior!=NULL){superior->requestApplications(request);}}}};class Majordomo:public Manager{public:Majordomo(string name):Manager(name){}void requestApplications(Request *request){if(request->requestType=="请假" && request->number<=5){cout<<name<<" "<<request->requestContent<<" 数量: "<<request->number<<"被批准"<<endl;}else {if(superior!=NULL){superior->requestApplications(request);}}}};class GeneralManager:public Manager{public:GeneralManager(string name):Manager(name){}void requestApplications(Request *request){if(request->requestType=="请假"){cout<<name<<" "<<request->requestContent<<" 数量: "<<request->number<<"被批准"<<endl;}}};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->requestType="请假";request->requestContent="李俊宏请假";request->number=1;jinli->requestApplications(request);request->requestType="请假";request->requestContent="李俊宏请假";request->number=4;jinli->requestApplications(request);request->requestType="请假";request->requestContent="李俊宏请假";request->number=10;jinli->requestApplications(request);return 0;}


原创粉丝点击