职责链模式

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

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

职责链模式_第1张图片

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

#include
#include
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;
}


你可能感兴趣的:(设计模式)