职责链模式

来源:互联网 发布:在线ppi计算器软件 编辑:程序博客网 时间:2024/06/03 23:45

大家可能去政府办过事,遇到一个效率不高的政府时,你可能就要头大了,A部门说你去B部门,B部门说你去C部门,C部门说你去B部门,然后你就头大了,不知道去哪里办理。再看另外一种情况,当地开发商可能要买一万亩的地,先去县里审批,县里一看太大了,审批权限不够,告诉你去市里审批,市里一看权限不够,告诉你去省里审批,省里一看权限不够,没办法啦,就去国土资源部审批吧,就像一个链条,当它发现自己的权限或能力不够的时候,告诉你去下一个地方,这样就提高了效率,在软件开发过程中我们称这种模式为职责链模式。

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


职责链优点:当客户提交一个请求时,请求时沿着链条传递到一个ConcreteHandler对象负责处理它,这样的话请求者不用管那个对象来处理,反正该请求总会被处理。接收者和发送者都没有对方的明确信息,并且链条中的对象也不知道链的结构,这样就实现了解耦。

#include<iostream>#include<string>using namespace std;class Request//一个请求,需要被处理的事件{private:int num;public:Request(int _num) :num(_num){}int getnum(){return num;}};class Handler//事件的处理者,无论是县级别的,还是市级别的抽象父类{protected:string name;//每个级别的处理者的名字Handler* sucessor;//下一个级别的处理者public:void SetSuccessor(Handler* sucessor)//每个处理者都有义务告诉你下一个处理者是谁{this->sucessor = sucessor;}virtual void HandleRequest(Request *r) = 0;//每个处理者都要处理到达的事物,无论成功与否virtual ~Handler(){}};class XianHandler : public Handler//县政府处理者{public:XianHandler(string _name) {name = _name;}void HandleRequest(Request *r)//处理时间请求{if (r->getnum() >= 0 && r->getnum() <= 100)//如果能处理{cout << name << "能处理 "<< r->getnum() << endl;}else //处理不了{cout << "处理不了,找" << typeid(*sucessor).name() << endl;this->sucessor->HandleRequest(r);//处理不了了,告诉他的下一个人去处理}}};class ShiHandler :  public Handler//市政府处理者{public:ShiHandler(string _name){name = _name;}void HandleRequest(Request *r)//处理时间请求{if (r->getnum() >= 100)//就假设有两级吧,最高级别的肯定能处理的,因此就没有调用继任者,当然了也没有继任者{     cout << name << "能处理 " << r->getnum() << endl;}}};void main(){Request r(1000);//我要买1000亩地Request r2(100);Handler* h1 = new XianHandler("县政府");Handler* h2 = new ShiHandler("市政府");h1->SetSuccessor(h2);//县政府的下一个是市政府,从这里发现,Request并不知道会被哪个Handler处理h1->HandleRequest(&r);//动态组合链条h1->HandleRequest(&r2);delete h1;delete h2;}


原创粉丝点击