作用:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.
举个栗子:
去麦当劳点餐,点了一个麦香鸡腿,麦当劳制作工作人员有很多,这个麦香鸡腿可能由任何一个工作人员制作,但我们并不知道是由谁去制作的,我们只关心鸡腿有没有被制作。
古代皇帝召见某位大臣时,一般是由龙椅旁边的宦官进行喊话,然后一个一个的接着喊下去,最后直到找到这位大臣为止,而皇帝并不知道是由哪一位宦官找到这位大臣的。
发出请求的客户端并不知道请求最终由谁去处理,这样系统的更改可以在不影响客户端的情况下动态的重新组织和分配职责。
职责链模式总结:
- 职责链模式中最关键的就是当客户提交一个请求时,请求沿链传递直到有一个对象处理这个请求为止。
- 这就使得接收者和发送者都并不知道对方的具体信息,且链中的每个对象也不知道链的结构。
- 职责链简化了对象的链接,每一个对象只有他后继者的引用,并不维护所有对象的引用。
- 职责链模式可以随时增加或者修改处理一个请求的结构,增强了给对象指派职责的灵活性。
UML 结构图:
例子:
#include<iostream>
using namespace std;
//抽象机类,定义一个处理请求的接口
class Staff
{
public:
Staff(Staff* pSuccessor = NULL) : m_pSuccessor(pSuccessor){}
virtual ~Staff()
{
delete m_pSuccessor;
m_pSuccessor = NULL;
}
//虚函数,由派生类实现
virtual void MakeChicken() = 0;
virtual void MakeHamburger () = 0;
protected:
Staff* m_pSuccessor;
};
class Staff1 : public Staff
{
public:
Staff1(Staff* pSuccessor = NULL) : Staff(pSuccessor){}
virtual ~Staff1(){}
virtual void MakeChicken()
{
if(NULL != m_pSuccessor && m_bBusy)
{
m_pSuccessor->MakeChicken();
return;
}
m_bBusy = true;
cout << "The staff1 is making chicken..." << endl;
}
virtual void MakeHamburger()
{
if(NULL != m_pSuccessor && m_bBusy)
{
m_pSuccessor->MakeHamburger();
return;
}
m_bBusy = true;
cout << "The staff1 is making hamburgers..." << endl;
}
private:
bool m_bBusy{};
};
class Staff2 : public Staff
{
public:
Staff2(Staff* pSuccessor = NULL) : Staff(pSuccessor){}
virtual ~Staff2(){}
virtual void MakeChicken()
{
if(NULL != m_pSuccessor && m_bBusy) //该工作人员正在制作汉堡包,做不了鸡腿,因此他将制作鸡腿的请求传给了它的后继者
{
m_pSuccessor->MakeChicken();
return;
}
m_bBusy = true;
cout << "The staff2 is making chicken..." << endl;
}
virtual void MakeHamburger()
{
if(NULL != m_pSuccessor && m_bBusy)
{
m_pSuccessor->MakeHamburger();
return;
}
m_bBusy = true;
cout << "The staff2 is making hamburgers..." << endl;
}
private:
bool m_bBusy{};
};
int main()
{
Staff* p1 = new Staff1();
Staff* p2 = new Staff2(p1);
p2->MakeHamburger(); //第二个工作人员正在制作汉堡
p2->MakeChicken();
delete p2;
p2 = NULL;
return 0;
}