设计模式之责任链模式。
责任链模式的作用是:推卸责任。
“推卸责任”听起来有些贬义的意思,但是有时候也确实存在需要“推卸责任”的情况。例如,当外部请求程序进行某个处理,但程序暂时无法决定由那个对象负责处理时,就需要推卸责任。这种情况下,我们需要考虑:将多个对象组织成一条职责链,然后按照他们在职责链上的顺序一个一个地找出到底应该谁来负责处理。
示例代码如下:
#include<iostream>
using namespace std;
//责任链模式
struct Teacher
{
char name;
int age;
Teacher* next;
};
//造完车以后需要把任务传递下去
class CarHandle
{
public:
virtual void HandleCar()=0;
void SetNextHandle(CarHandle* handle)
{
m_handle = handle;
}
virtual ~CarHandle(){}
protected:
CarHandle* m_handle;//下一个处理单元
};
class CarHeadHandle:public CarHandle
{
public:
virtual void HandleCar()
{
cout<<"造车头"<<endl;
if(m_handle!=NULL)
{//造完 车头 ,把任务交给下一个处理者。
m_handle->HandleCar();
}
}
};
class CarBodyHandle:public CarHandle
{
public:
virtual void HandleCar()
{
cout<<"造车身"<<endl;
if(m_handle!=NULL)
{//造完 车身 ,把任务交给下一个处理者。
m_handle->HandleCar();
}
}
};
class CarTailHandle:public CarHandle
{
public:
virtual void HandleCar()
{
cout<<"造车尾"<<endl;
if(m_handle!=NULL)
{//造完 车尾 ,把任务交给下一个处理者。
m_handle->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();
delete pBodyHandle;
delete pHeadHandle;
delete pTailHandle;
return 0;
}
执行程序,运行结果如下图所示:
该模式在具体的程序库中使用的例子如下(后续补充):