C++設計模式淺識職責鏈模式

職責鏈模式(ChainOfResponsibility):使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這個對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它爲止。

職責鏈的好處:

  1. 當客戶提交一個請求時,請求時沿鏈傳遞直至有一個ConcreteHandler對象負責處理它。
  2. 使得接收者和發送者都沒有對方的明確信息且鏈中的對象自己也並不知道鏈的結構。結果是職責鏈可簡化對象的相互鏈接,它們僅需保持一個指向其後繼者的引用,而不需保持它所有的候選接受者的引用。

客戶端:

//Client
int main(){
    Handler *h1 = new ConcreteHandler;
    Handler *h2 = new ConcreteHandler2;
    Handler *h3 = new ConcreteHandler3;

    //設置職責鏈上家與下家
    h1->setSuccessor(h2);
    h2->setSuccessor(h3);

    //請求
    int request[8] = {2, 5, 14, 22, 18, 3, 23, 20};
    //循環給最小處理者提交請求,不同的數額由不同權限處理者處理
    for(auto i = 0; i < 8; ++i){
        h1->HandleRequest(request[i]);
    }
    // Output:
    //     Handler request
    //     Handler request
    //     Handler2 request
    //     Handler3 request
    //     Handler2 request
    //     Handler request
    //     Handler3 request
    //     Handler3 request

    return 0;
}

類實現:

//Handler處理類
class Handler{
protected:
    Handler *successor;
public:
    //設置繼任者
    void setSuccessor(Handler *successor){
        this->successor = successor;
    }
    //處理請求的抽象方法
    virtual void HandleRequest(int request){}
};

//具體處理類,處理它們負責的請求,可訪問的後繼者,如果可以處理該請求,就處理之,否則就將該請求轉發給它的後繼者
class ConcreteHandler: public Handler{
public:
    virtual void HandleRequest(int request)override{
        //0~10在此處理
        if(request >= 0 && request < 10){
            std::cout << "Handler request\n";
        }else if(successor != NULL) //否則轉移到下一位
            successor->HandleRequest(request);
    }
};

class ConcreteHandler2: public Handler{
public:
    virtual void HandleRequest(int request)override{
        //10~20在此處理
        if(request >= 10 && request < 20){
            std::cout << "Handler2 request\n";
        }else if(successor != NULL) //否則轉移到下一位
            successor->HandleRequest(request);
    }
};

class ConcreteHandler3: public Handler{
public:
    virtual void HandleRequest(int request)override{
        //20~30在此處理
        if(request >= 20 && request < 30){
            std::cout << "Handler3 request\n";
        }else if(successor != NULL) //否則轉移到下一位
            successor->HandleRequest(request);
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章