1、作用
假设存在一个请求以及多个对象。为了使多个对象都有机会处理这个请求,将这些对象连成一条链,并沿着该链传递这个请求,直到有一个对象处理请求为止。
举一个例子。在《步步惊心》中,假如康熙皇帝在太和殿要召见马尔泰若曦,皇帝得先通知旁边的太监李德全,然后李德全高喊“传马尔泰若曦进谏”,接着站在太和殿外的太监依次高喊“传马尔泰若曦进谏”,直到有一个太监传到马尔泰若曦。在这里中,“召见马尔泰若曦”就是一个请求,而那些太监就是处理该请求的多个对象。请求一直传递直到有对象处理了该请求。
2、结构图
3、Code --C++
以下代码采用链表形式实现责任者链模式。实现要点有:
(1)处理者节点是基类,对请求的处理过程在各个派生类中实现。
(2)将请求丢给处理者链表,由处理者链表负责传递。
// 处理者节点基类
class CHandlerNode
{
public:
CHandlerNode(CHandlerNode *pNextCHandlerNode = NULL);
virtual ~CHandlerNode();
public:
virtual void HandleRequest() = 0;
public:
CHandlerNode *m_pNextCHandlerNode;
}
// 处理者链类
class CHandlerChain
{
public:
CHandlerChain();
~CHandlerChain();
public:
AddHandlerNode(CHandlerNode *pCHandlerNode);
DestroyHandlerNode();
void Process(void *Request);
public:
CHandlerNode *m_pCHandlerNodeHead;
}
// 处理者A类
class CHandlerRuquestA : public CHandlerNode
{
public:
CHandlerRuquestA();
virtual ~CHandlerRuquestA();
public:
virtual void HandleRequest();
}
// 处理者B类
class CHandlerRuquestB : public CHandlerNode
{
public:
CHandlerRuquestB();
virtual ~CHandlerRuquestB();
public:
virtual void HandleRequest();
}
// Main
void main()
{
CHandlerChain ObjCHandlerChain;
ObjCHandlerChain.AddHandlerNode(::new CHandlerRuquestA());// 处理者A加入链表
ObjCHandlerChain.AddHandlerNode(::new CHandlerRuquestB());// 处理者B加入链表
ObjCHandlerChain.Process(void *Request); // 处理请求...
ObjCHandlerChain.DestroyHandlerNode();
}