概念
Chain of Responsibility(CoR)模式也叫职责链模式或者职责连锁模式,是行为模式之一,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链(形成一个链表,按链的顺序执行),并沿着这条链传递该请求,直到有一个对象处理它为止.
例1:比如客户Client要完成一个任务,这个任务包括a,b,c,d四个部分。 首先客户Client把任务交给A,A完成a部分之后,把任务交给B,B完成b部分,…,直到D完成d部分。
例2:比如政府部分的某项工作,县政府先完成自己能处理的部分,不能处理的部分交给省政府,省政府再完成自己职责范围内的部分,不能处理的部分交给中央政府,中央政府最后完成该项工作。
Handler
处理类的抽象父类。
concreteHandler
具体的处理类。
责任链优缺点
优点:
1。责任的分担。每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。
2。可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。
3。类与类之间可以以松耦合的形式加以组织。
缺点:
因为处理时以链的形式在对象间传递消息,根据实现方式不同,有可能会影响处理的速度。
适用于:
链条式处理事情。工作流程化、消息处理流程化、事物流程化;
class CarHandle
{
public:
virtual void HandleCar() = 0;
public:
CarHandle*setNextHandle(CarHandle *carhandle)
{
this->carhandle= carhandle;
return this->carhandle;
}
protected:
CarHandle*carhandle;
};
class CarHandleHead : public CarHandle
{
public:
virtual void HandleCar()
{
cout << "处理车头" << endl;
if(this->carhandle != NULL)
{
carhandle->HandleCar();
}
}
};
class CarHandleBody : public CarHandle
{
public:
virtual void HandleCar()
{
cout << "处理车身" << endl;
if(this->carhandle != NULL)
{
carhandle->HandleCar();
}
}
};
class CarHandleTail : public CarHandle
{
public:
virtual void HandleCar()
{
cout<< "处理车尾" << endl;
if(this->carhandle != NULL)
{
carhandle->HandleCar();
}
}
};
void main()
{
CarHandleHead*head = new CarHandleHead;
CarHandleBody*body = new CarHandleBody;
CarHandleTail*tail = new CarHandleTail;
head->setNextHandle(body);
body->setNextHandle(tail);
tail->setNextHandle(NULL);
//处理
head->HandleCar();
delete head;
delete body;
delete tail;
system("pause");
return;
}
要点总结
Chain of Responsibility模式的应用场合在于“一个请求可能有多个接受者,但是最后真正的接受者只有一个”,这时候请求发送者与接受者的耦合有可能出现变化脆弱的症状,责任链的目的就是将二者解耦,从而更好地应对变化
如果请求传递到职责链的末尾仍得不到处理,应该有一个合理的缺省机制。这也是每个接收对象的责任,而不是发出请求的对象的责任。