責(zé)任鏈模式(Chain of Responsibility)的目標(biāo)是使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。結(jié)構(gòu)圖為:

用一個(gè)采購(gòu)的例子來(lái)說(shuō)明,采購(gòu)人員在進(jìn)行采購(gòu)前需經(jīng)過(guò)上級(jí)部門的批準(zhǔn),對(duì)于不同金額的采購(gòu)分別要由不同級(jí)別的上級(jí)才能審批,假設(shè)1萬(wàn)以內(nèi)的采購(gòu)需要主管批準(zhǔn),10萬(wàn)以內(nèi)的需要主管向總經(jīng)理申請(qǐng)批準(zhǔn),超過(guò)10萬(wàn)總經(jīng)理向需董事長(zhǎng)宴請(qǐng)批準(zhǔn),這時(shí)對(duì)于采購(gòu)的審批過(guò)程就形成了一條責(zé)任鏈,對(duì)于不同的采購(gòu)請(qǐng)求就需要一級(jí)一級(jí)的向上傳遞,并最終傳遞到最上級(jí)然后自行處理。
結(jié)構(gòu)圖如下:

實(shí)現(xiàn)代碼:
//Processor.h
class Processor
{
public:
virtual ~Processor();
virtual void Request(double) = 0;
void SetSuccessor(Processor*);
protected:
Processor();
Processor* m_pProcessor;
};
//Processor.cpp
#include "stdafx.h"
#include "Processor.h"
Processor::Processor()
{
}
Processor::~Processor()
{
if(m_pProcessor != NULL)
{
delete m_pProcessor;
m_pProcessor = NULL;
}
}
void Processor::SetSuccessor(Processor* pProcessor)
{
m_pProcessor = pProcessor;
}
//Director.h
#include "Processor.h"
class Director : public Processor
{
public:
Director();
virtual ~Director();
void Request(double);
};
//Director.cpp
#include "stdafx.h"
#include "Director.h"
#include <iostream>
using namespace std;
Director::Director()
{
}
Director::~Director()
{
}
void Director::Request(double dAmount)
{
if(dAmount <= 10000)
{
cout << "主管審批了采購(gòu)請(qǐng)求" << endl;
}
else
{
cout << "申請(qǐng)金額走出主管權(quán)限范圍,需向總經(jīng)理申請(qǐng)審批" << endl;
if(this->m_pProcessor != NULL)
{
m_pProcessor->Request(dAmount);
}
}
}
//Manager.h
#include "Processor.h"
class Manager : public Processor
{
public:
Manager();
virtual ~Manager();
void Request(double);
};
//Manager.cpp
#include "stdafx.h"
#include "Manager.h"
#include <iostream>
using namespace std;
Manager::Manager()
{
}
Manager::~Manager()
{
}
void Manager::Request(double dAmount)
{
if(dAmount <= 100000)
{
cout << "總經(jīng)理審批了采購(gòu)請(qǐng)求" << endl;
}
else
{
cout << "申請(qǐng)金額超出總經(jīng)理權(quán)限范圍,需向董事長(zhǎng)申請(qǐng)審批" << endl;
if(this->m_pProcessor != NULL)
{
m_pProcessor->Request(dAmount);
}
}
}
//Chariman.h
#include "Processor.h"
class Chariman : public Processor
{
public:
Chariman();
virtual ~Chariman();
void Request(double);
};
//Chariman.cpp
#include "stdafx.h"
#include "Chariman.h"
#include <iostream>
using namespace std;
Chariman::Chariman()
{
}
Chariman::~Chariman()
{
}
void Chariman::Request(double dAmount)
{
cout << "董事長(zhǎng)審批了采購(gòu)請(qǐng)求" << endl;
}
//main.cpp
#include "stdafx.h"
#include "Processor.h"
#include "Director.h"
#include "Manager.h"
#include "Chariman.h"
int main(int argc, char* argv[])
{
Processor* pDirector = new Director;
Processor* pManager = new Manager;
Processor* pChariman = new Chariman;
pDirector->SetSuccessor(pManager);
pManager->SetSuccessor(pChariman);
pDirector->Request(10000000.00);
return 0;
}
代碼中申請(qǐng)了超過(guò)10成的訂購(gòu)請(qǐng)求,于是各級(jí)別負(fù)責(zé)人一步一步向上級(jí)提交申請(qǐng),并最終由最上層決定審批結(jié)果。
運(yùn)行結(jié)果如下:
申請(qǐng)金額超出主管權(quán)限范圍,需向總經(jīng)理申請(qǐng)審批
申請(qǐng)金額超出總經(jīng)理權(quán)限范圍,需向董事長(zhǎng)申請(qǐng)審批
董事長(zhǎng)審批了采購(gòu)請(qǐng)求