设计模式的理解: 职责链模式 (Chain of Responsibility)
生活随笔
收集整理的這篇文章主要介紹了
设计模式的理解: 职责链模式 (Chain of Responsibility)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ?職責鏈模式(Chain of Responsibility Pattern),為請求創建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬于行為型模式。在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。
? ? ? 簡言之,當有一個請求發送時,有一群對象可以按照優先級接受這些請求。職責鏈模式就是通過鏈表的形式完成下面操作,在現在來看這種實現方法有點落后,但是放在1994年還是很有指導意義的。
? ? ? ?
?
在圖形界面程序中有些控件可以觸發單機事件,例如
一個Winform 窗體上放了一個? 控件組GroupBox? ?,控件組上放了一個Label 標簽控件。我們設置?Label 標簽 和?GroupBox 控件組沒有單擊不發生作用,當單擊Label時,單擊請求自上而下的傳遞到Winform中觸發Winform 窗體的單擊事件:
class Requset{ private:string msg_; public:Requset(){msg_ ="點擊請求";}string getMsg(){return msg_;}; }/****這個類時重點****/ class ChainHandler{ChainHandler * nextHandler;void sendRequestToNextHandler (const Requset & rq){if(nextHandler !=nullptr){nextHandler->handle(rq);}}protected:virtual bool canHandleRequest() = 0;virtual void handleProcess(const Requset & rq)=0; public:ChainHandler(){nextHandler =nullptr;}void setNextHandler(ChainHandler * next){nextHandler=next;}void handle(const Requset & rq){if(canHandleRequest()){handleProcess(rq);}else{sendRequestToNextHandler(rq);}} }/**********接下來的類只要負責實現canHandleRequest和handleProcess就行************/ class Winform :public ChainHandler{public:void handleProcess(const Requset & rq){cout<<"Winform 處理了"<<rq.getMsg();}bool canHandleRequest(){return true;} }class GroupBox :public ChainHandler{public:void handleProcess(const Requset & rq){}bool canHandleRequest(){return false;} }class Label :public ChainHandler{void handleProcess(const Requset & rq){ cout<<"Label 傳遞了"<<rq.getMsg();}public:bool canHandleRequest(){return false;}void handle(const Requset & rq){handleProcess(rq);sendRequestToNextHandler(rq);} }ChainHandler 類是重點,用戶調用handle 函數實現 “當自己不能處理,就傳遞到下一個關聯控件“的需求 。當然也可以重寫handle 實現“當自己處理完后,也傳遞到下一個關聯控件“,只需要把if邏輯刪除就行
void main(){Label label;GroupBox groupbox;Winform winform ;Request rq;label.setNextHandler(&groupbox);groupbox.setNextHandler(&winform);//---------------------groupbox.handle(rq);//輸出 Winform 處理了點擊請求//-------------------------label.handel(rq);//輸出 Label 傳遞了點擊請求 Winform 處理了點擊請求//------------------------- }?
?
?
?
總結
以上是生活随笔為你收集整理的设计模式的理解: 职责链模式 (Chain of Responsibility)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式的理解:迭代器模式(Iterat
- 下一篇: 设计模式的理解:命令模式 (Comman