設(shè)計(jì)模式-行為模式-職責(zé)鏈模式

這個(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容