定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象链成一条链,并沿着这条链传递该请求/命令,直到有对象处理它为止
类图
代码示例
class Handle_Car
{
public:
virtual void makecar() = 0;
void setNextHandle(Handle_Car *next)
{
nextHandel = next;
}
protected:
Handle_Car *nextHandel;
};
class Handel_Head :public Handle_Car
{
public:
void makecar() override
{
cout << "制造车头\n";
if (nextHandel)
{
nextHandel->makecar();
}
}
};
class Handel_Body :public Handle_Car
{
public:
void makecar() override
{
cout << "制造车身\n";
if (nextHandel)
{
nextHandel->makecar();
}
}
};
class Handel_Tail :public Handle_Car
{
public:
void makecar() override
{
cout << "制造车尾\n";
if (nextHandel)
{
nextHandel->makecar();
}
}
};
void main()
{
Handle_Car *head = new Handel_Head;
Handle_Car *body = new Handel_Body;
Handle_Car *tail = new Handel_Tail;
head->setNextHandle(body);
body->setNextHandle(tail);
tail->setNextHandle(NULL);
head->makecar();
delete head;
delete body;
delete tail;
system("pause");
}
结果:
责任链模式的优点
责任链模式非常显著的优点是将请求和处理分开 . 请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌 .
责任链模式的缺点
责任链有两个非常显著的缺点:
一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题 .
二是调试不很方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂 .
责任链模式的注意事项
链中节点数量需要控制,避免出现超长链的情况,一般的做法是在Handler中设置一个最大节点数量,在setNext方法中判断是否已经是超过其阈值,超过则不允许该链建立,避免无意识地破坏系统性能 .