天天看點

設計模式——職責鍊(chain of responsibility)

常常在一些元件内部會有特定資料結構,如果客戶代碼直接使用這些特定資料結構,會極大破壞元件複用;是以,可以将元件中主句結構封裝在内部,為外部提供統一的接口,來實作與特定資料結構無關的通路。

composite,iterator,chain of responsibility屬于資料結構模式。

motivation:一個請求可能會被多個對象處理,但是每個請求隻能有一個接收者;如果顯示指定,一定會給發送者和接收者帶來緊耦合;将這些接收者對象連城一條鍊,沿着這條鍊進行傳遞請求,直到有一個對象處理該請求為止。

key interface or class:

        1. Handler接口。

feature: 。

structure:

設計模式——職責鍊(chain of responsibility)

template codes:

class Request{
    //實作具體Request類
}

//基類
class ChainHandler{
private:
    ChainHandler* nextHdlr;
    endRequestToNext(){
        if(nextHdlr != nullptr){
            nextHdlr->handle();
        }
    }

protected:
    virtual void processRequest(const Request& req)=0;
    virtual bool canProcessRequest(const Request& req)=0;
public:
    ChainHandler(){nextHdlr = nullptr;}
    void setNexthandler(ChainHandler* next){
        nextHdlr = next;
    }

    void handle(){
        if(canProcessRequest()){    
            processRequest();
        }
        else
            endRequestToNext();
    }

};


//是實作不同的handler
class Handler1{
protected:
    void processRequest(const Request& req) override{
        //實作對應的方法
    }
    boolcanProcessRequest(const Request& req) override{
        //實作對應的方法
    }
};
class Handler2{
protected:
    void processRequest(const Request& req) override{
        //實作對應的方法
    }
    boolcanProcessRequest(const Request& req) override{
        //實作對應的方法
    }
};

int main(){
    Handler1 hdlr1;
    Handler2 hdlr2;
    Handler3 hdlr3;
    hdlr1.setNexthandler(hdlr2);
    hdlr2.setNexthandler(hdlr3);

    Request req("..");
    hdlr1.handle(req);
}

           

summary:

1. chain of responsibility 适用于“請求可能有多個處理者,但是最後隻有一個真正的處理者”;

2.應用chain of responsibility之後,對象的指責分派更具有靈活性;可以在運作時動态添加、修改請求的處理職責;

3.如果請求在最後都沒有得到處理,則應該規定預設操作;這應該在處理者中完成,而不是由請求發出者來規定。

繼續閱讀