這個(gè)模式也叫責(zé)任鏈模式。這種模式解決的是一個(gè)請求可能由多個(gè)類處理的問題,可以處理的多個(gè)類可以按照優(yōu)先級先后決定自己能否處理請求。
以下代碼定義了可以處理請求的接收者。以處理整型數(shù)字為例,兩個(gè)子類分別處理正數(shù)和負(fù)數(shù)。
#include <iostream>
using namespace std;
class Receiver
{
public:
virtual ~Receiver(){}
virtual bool Receive(int value) = 0;
};
class PositiveReceiver:public Receiver
{
private:
Receiver* NextReceiver;
public:
PositiveReceiver(Receiver* rcvr):NextReceiver(rcvr){}
bool Receive(int value)
{
if (value > 0)
{
cout<<__PRETTY_FUNCTION__<<endl;
return true;
}
else
{
if (NextReceiver)
{
return NextReceiver->Receive(value);
}
}
return false;
}
};
class NegativeReceiver:public Receiver
{
private:
Receiver* NextReceiver;
public:
NegativeReceiver(Receiver* rcvr):NextReceiver(rcvr){}
bool Receive(int value)
{
if (value < 0)
{
cout<<__PRETTY_FUNCTION__<<endl;
return true;
}
else
{
if (NextReceiver)
{
return NextReceiver->Receive(value);
}
}
return false;
}
};
以下代碼定義了一個(gè)請求發(fā)送者。它可以發(fā)送一個(gè)處理數(shù)字的請求。
class Requester
{
private:
Receiver* receiver;
public:
Requester(Receiver* rcvr):receiver(rcvr){}
void Request(int value)
{
cout<<__FUNCTION__<<" value="<<value<<endl;
bool bResult = receiver->Receive(value);
cout<<__FUNCTION__<<" result="<<bResult<<endl<<endl;
}
};
以下代碼演示了職責(zé)鏈模式。首先建立負(fù)數(shù)處理對象,再用它建立正數(shù)處理對象,最后請求者將請求發(fā)給正數(shù)處理對象。正數(shù)處理對象會優(yōu)先處理,遇到不大于0的數(shù),就會將數(shù)字給下一個(gè)處理者——負(fù)數(shù)處理對象。
在這個(gè)處理鏈中有一個(gè)漏洞,就是數(shù)字0沒人處理,這在實(shí)踐中要注意避免。
int main(void){
Receiver* NR = new NegativeReceiver(nullptr);
Receiver* PR = new PositiveReceiver(NR);
Requester R(PR);
R.Request(1);
R.Request(0);
R.Request(-1);
delete NR;
delete PR;
return 0;
}
輸出
Request value=1
virtual bool PositiveReceiver::Receive(int)
Request result=1
Request value=0
Request result=0
Request value=-1
virtual bool NegativeReceiver::Receive(int)
Request result=1