概念
Chain Of Responsibility(CoR)模式也叫责任链模式,是行为模式之一。该模式构造一系列分别担当不同的职责的类对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称为责任链模式(或者职责链模式)。
责任链模式类结构图
Handler: 处理类的抽象父类;
ConcreteHandler:具体的处理类;
实例代码
代码完成一个造车流程:造车头,造车身,造车尾。
非责任链模式代码如下:
#include <iostream>
using namespace std;
class CarHandle
{
public:
virtual void handleCar() = 0;
};
class CarHeadHandle : public CarHandle
{
public:
virtual void handleCar()
{
cout<<"handle car head~"<<endl;
}
};
class CarBodyHandle : public CarHandle
{
public:
virtual void handleCar()
{
cout<<"handle car body~"<<endl;
}
};
class CarTailHandle : public CarHandle
{
public:
virtual void handleCar()
{
cout<<"handle car tail~"<<endl;
}
};
int main()
{
//非责任链模式(造车的业务逻辑写死在客户端了)
CarHandle* pHead = new CarHeadHandle;
CarHandle* pBody = new CarBodyHandle;
CarHandle* pTail = new CarTailHandle;
pHead->handleCar();
pBody->handleCar();
pTail->handleCar();
return 0;
}
非责任链代码把这个流程写死在客户端,一旦流程变动,客户端代码就要跟着变动。
责任链模式代码如下:
#include <iostream>
using namespace std;
#include <iostream>
using namespace std;
//责任链模式要求:完成一部分(造车)任务后,要把任务传递下去
class CarHandle
{
public:
virtual void handleCar() = 0;
CarHandle* setNextHandle(CarHandle* handle)
{
m_pCarHandle = handle;
return m_pCarHandle;
}
protected:
CarHandle* m_pCarHandle; //用于保存下一个处理单元
};
class CarHeadHandle : public CarHandle
{
public:
virtual void handleCar()
{
cout<<"handle car head~"<<endl;
//造完车头后如果还有任务就把任务递交给下一个处理者
if(m_pCarHandle)
{
m_pCarHandle->handleCar();
}
}
};
class CarBodyHandle : public CarHandle
{
public:
virtual void handleCar()
{
cout<<"handle car body~"<<endl;
//造完车身后如果还有任务就把任务递交给下一个处理者
if(m_pCarHandle)
{
m_pCarHandle->handleCar();
}
}
};
class CarTailHandle : public CarHandle
{
public:
virtual void handleCar()
{
cout<<"handle car tail~"<<endl;
//造完车头尾如果还有任务就把任务递交给下一个处理者
if(m_pCarHandle)
{
m_pCarHandle->handleCar();
}
}
};
int main()
{
//非责任链模式(造车的业务逻辑写死在客户端了)
CarHandle* pHeadHandle = new CarHeadHandle;
CarHandle* pBodyHandle = new CarBodyHandle;
CarHandle* pTailHandle = new CarTailHandle;
//任务的处理(传递)关系
pHeadHandle->setNextHandle(pBodyHandle);
pBodyHandle->setNextHandle(pTailHandle);
pTailHandle->setNextHandle(NULL);
pHeadHandle->handleCar();
return 0;
}
运行结果:
责任链模式优点
责任链模式降低了发出命令和处理命令对象之间的耦合,她允许多于一个的处理者对象根据自己的逻辑来决定这个处理流程。发出命令的对象只是把命令传给链条的起始者,而不必把命令分发给左右的其他对象;这意味着在处理命令上,允许系统有更多的灵活性。哪一个对象最终处理一个命令可以因为有哪些对象参加责任链、以及这些对象在责任链上的位置不同而不同。