定义:
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
类图:
示例:其思想很简单,考虑员工要求加薪。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。
class Handle
{
public:
Handle(){}
virtual ~Handle(){}
void SetSuccessor(Handle* successor) //设置后继,这里必须用指针,只是声明,没有去定义。
{
this->h_hander = successor;
}
virtual void HandleRequest(int request)=0; //处理请求
protected:
Handle* h_hander;
};
class Handler1:public Handle
{
public:
void HandleRequest(int request);
};
class Handler2:public Handle
{
public:
void HandleRequest(int request);
};
class Handler3:public Handle
{
public:
void HandleRequest(int request);
};
#include <iostream>
#include "Test.h"
using namespace std;
void Handler1::HandleRequest(int request)
{
if (request >=0 && request < 10)
{
cout<<"Handle1"<<endl;
}
else if(NULL != h_hander)
{
h_hander->HandleRequest(request);
}
}
void Handler2::HandleRequest(int request)
{
if (request >=10 && request < 20)
{
cout<<"Handle2"<<endl;
}
else if(NULL != h_hander)
{
h_hander->HandleRequest(request);
}
}
void Handler3::HandleRequest(int request)
{
if (request >=20 && request < 30)
{
cout<<"Handle3"<<endl;
}
else if(NULL != h_hander)
{
h_hander->HandleRequest(request);
}
}
int main()
{
Handle* h1 = new Handler1;
Handle* h2 = new Handler2;
Handle* h3 = new Handler3;
h1->SetSuccessor(h2);
h2->SetSuccessor(h3);
h1->HandleRequest(15);
return 0;
}
优缺点:
缺点:当链很长时,前面的对象没有做任何的事情,而只是做了一个传递工作。而传递工作之后,他们就成了垃圾对象。也就是说,他们在实际的处理中,并没有发挥任何的作用。会产生很多的内存垃圾对象。
优点:请求的发送者不用关心具体由哪个对象来处理,只要可以处理就可以了。