常常在一些元件内部會有特定資料結構,如果客戶代碼直接使用這些特定資料結構,會極大破壞元件複用;是以,可以将元件中主句結構封裝在内部,為外部提供統一的接口,來實作與特定資料結構無關的通路。
composite,iterator,chain of responsibility屬于資料結構模式。
motivation:一個請求可能會被多個對象處理,但是每個請求隻能有一個接收者;如果顯示指定,一定會給發送者和接收者帶來緊耦合;将這些接收者對象連城一條鍊,沿着這條鍊進行傳遞請求,直到有一個對象處理該請求為止。
key interface or class:
1. Handler接口。
feature: 。
structure:
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.如果請求在最後都沒有得到處理,則應該規定預設操作;這應該在處理者中完成,而不是由請求發出者來規定。