優點: 請求和處理分開
缺點:
避免出現超長鏈的情況, 一般的做法是在handler中設定乙個最大節點數量, 在setnext方法中判斷是否已經是超過其閾值, 超過則不允許該鏈建立, 避免無意識地破壞系統效能抽象處理者
#ifndef handler_h
#define handler_h
#include "request.h"
#include "response.h"
class handler else
//判斷是否有下乙個處理者
//注意此處如果已經符合了級別並處理完成了訊息還會繼續向下傳
//若只需要當前級別訊息被一次處理只需要將下屬判斷你放到上面的else內
if(nexthandler != nullptr) else
return response;
}//設定下乙個處理者是誰
void setnext(handler *handler)
protected:
//每個處理者都有乙個處理級別
virtual level gethandlerlevel() = 0;
//每個處理者都必須實現處理任務
virtual response echo(request *request) = 0;
};#endif // handler_h
處理者
#ifndef concretehandler_h
#define concretehandler_h
#include "handler.h"
#include "level.h"
#include "response.h"
class concretehandler1 : public handler
//設定自己的處理級別
level gethandlerlevel() override
};//還有第二第三個省略了
#endif // concretehandler_h
處理請求的級別
#ifndef level_h
#define level_h
enum level ;
#endif // level_h
抽象處理請求和具體處理請求
#ifndef request_h
#define request_h
#include "level.h"
class request ;
class request1 : public request
};class request2 : public request
};#endif // request_h
處理結果
#ifndef response_h
#define response_h
#include "qdebug"
class response
};#endif // response_h
main
#include "concretehandler.h"
#include "request.h"
#include "response.h"
int main(int argc, char *ar**)
結果
handler1 echo request
handler3 echo request
handler2 echo request
上述例子一共發了兩次請求有三個響應是因為在抽象處理者中,無論是否訊息已處理均向下傳播保證訊息遍歷所有處理者,可以在處理成功後直接結束避免乙個請求被多個不同處理者處理原始碼github:cppdesignpattern
coologic 部落格網域名稱已更改,已從 www.techieliang.com 改為
www.coologic.cn,上述鏈結位址受到影響,若需檢視源文請手動修改,多有不便,敬請諒解。
設計模式 責任鏈模式
定義 避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些請求連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。例項 請假加薪審批 using system using system.collections.generic using system.text namespa...
設計模式 責任鏈模式
責任鏈可以使得系統在不影響客戶端的前提下動態的安排責任鏈和分配責任。責任鏈模式中包含的角色有抽象處理者,具體處理者以及請求的傳送者。責任鏈可以是一條直線,乙個環鏈甚至乙個樹結構。它使得每乙個具體的訊息處理者都有可能處理訊息。抽象的請求處理者 author wly public abstract cl...
設計模式 責任鏈模式
責任鏈模式 chain ofresponsibility pattern 基本概念 責任鏈,顧名思義,是指乙個負責相應請求的行為鏈。首先要理解的是乙個鏈,然後通過這個鏈來管理個行為。什麼時候會用到責任鏈 對於乙個請求,沒有特別指明由誰處理或沒有指明如何處理。此時可以使用責任鏈的形式,用過將各種處理行...