責任鏈模式(Chain of Responsibility)的目標是使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞請求,直到有一個對象處理它為止。結構圖為:

用一個采購的例子來說明,采購人員在進行采購前需經過上級部門的批準,對于不同金額的采購分別要由不同級別的上級才能審批,假設1萬以內的采購需要主管批準,10萬以內的需要主管向總經理申請批準,超過10萬總經理向需董事長宴請批準,這時對于采購的審批過程就形成了一條責任鏈,對于不同的采購請求就需要一級一級的向上傳遞,并最終傳遞到最上級然后自行處理。
結構圖如下:

實現代碼:
//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 << "主管審批了采購請求" << endl;
}
else
{
cout << "申請金額走出主管權限范圍,需向總經理申請審批" << 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 << "總經理審批了采購請求" << endl;
}
else
{
cout << "申請金額超出總經理權限范圍,需向董事長申請審批" << 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 << "董事長審批了采購請求" << 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;
}
代碼中申請了超過10成的訂購請求,于是各級別負責人一步一步向上級提交申請,并最終由最上層決定審批結果。
運行結果如下:
申請金額超出主管權限范圍,需向總經理申請審批
申請金額超出總經理權限范圍,需向董事長申請審批
董事長審批了采購請求