C 設計模式 職責鏈模式

2021-09-26 01:45:50 字數 2674 閱讀 3409

目錄

基本概念

**與例項

在哪種地方使用

職責鏈模式(chain of responsibility):時多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連線成一條鏈,並沿著這條鏈條傳遞該請求,直到有乙個物件處理它為止。

這裡發出這個請求的客戶端並不知道這當中的哪個物件最終處理這個請求,這樣系統的更改可以在不影響客戶端的情況下動態的重新組織和分配責任。

結構圖如下(此圖**於大話設計模式)

職責鏈的好處:當客戶提交乙個請求時,請求是沿著鏈傳遞直至有乙個concretehandler物件負責處理它。隨時的增加或修改處理乙個請求的結構。增強了物件指派職責的靈活性。乙個請求極可能導論鏈的末端都得不到處理,或者因為沒有正確配置而得不到處理。

程式執行截圖如下:

//handler類,定義乙個處理請示的介面

class handler;

/*concretehandler類,具體處理者類,處理它所負責的請求,可訪問它的後繼者,如果可處理該請求就處理之,

否則就將該請求**給它的後繼者。

*/class concretehandler1 : public handler;

//concretehandler2,當請求數在10到20之間則有權處理,否則轉移到下一位

class concretehandler2: public handler;

//concretehandle3,當請求數在20到30之間則有權處理,否則轉移到下一位

class concretehandler3: public handler;

#endif // !head_h

head.cpp

#include "head.h"

#include void handler::setsuccessor(handler *successor)

void handler::handlerequest(int request)

handler::~handler()

handler::handler()

handler::handler(handler &handler)

handler & handler::operator=(handler &h)

void concretehandler1::handlerequest(int request)

else if(m_successor != nullptr)

else

}concretehandler1::~concretehandler1()

void concretehandler2::handlerequest(int request)

else if(m_successor != nullptr)

else

}concretehandler2::~concretehandler2()

void concretehandler3::handlerequest(int request)

else if(m_successor != nullptr)

else

}concretehandler3::~concretehandler3()

main.cpp

#include "head.h"

int main(int *argc, int *ar**);

//int requests = ;

for(int i = 0; i < sizeof(requests) / sizeof(requests[0]); i++)

delete h1;

delete h2;

delete h3;

getchar();

return 0;

}

轉眼間工作18個月了(加實習),在這18個月的時間,真的是學到了很多東西。下面是本人18個月的工作經驗,對這種設計模式應該可以在哪種地方使用!!

本人認為,可以在2種地方使用!

一種是udp伺服器,和某伺服器內部採用,舉個栗子!!!

第一種udp伺服器:

當接收到資料報後,馬上解析,這裡使用職責鏈模式,解析後給對應的handlder,然後對應的handler傳送訊息給對應的訊息佇列(這裡舉個例子,使用訊息匯流排,比如rabbitmq),然後各個處理程序監聽自己的佇列,這樣就可以很好的實現大資料處理和解耦合了!!!!

第二種是某伺服器內部:

比如某個會員,他可以花錢提公升為v1,v2,v3,v4。當使用者衝錢提公升後,先看他有沒有上級,如果有上級,並且提示的等級在他上級之下,就把訊息傳送給某上級程序(這裡同樣可以採用rabbitmq),當發現等級提示到他上級以上後,就傳送給他上級的上級的佇列,最後等級直接傳送給管理員,然後給指定的佇列。然後這樣處理,耦合性也處理了!!!

設計模式 職責鏈模式 C

職責鏈模式 解耦請求的傳送者和請求的接受者,使多個物件都由機會接收到這個請求。所有的物件形成一條鏈,在這條鏈中總有乙個物件可以出來這個請求。場景 有多個物件可以處理乙個請求,那個物件處理這個請求則執行時確定 在不明確接受者的情況下,向多個物件中傳送乙個請求 include 任務型別 enum typ...

C 設計模式 職責鏈模式

什麼是職責鏈模式?在gof的 設計模式 可復用物件導向軟體的基礎 一書中對職責鏈模式是這樣說的 使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,直到有乙個物件處理它為止 如下圖 對於每個角色,他們都有他們的職責 當我提交了休假申請時,專案經理需要判斷,看...

c 設計模式 職責鏈模式

本文參考 假如有多個物件可以處理同乙個請求,但是具體由哪個物件處理是在執行時刻動態決定的。這時就可以使用職責鏈模式,將處理請求的物件實現成職責物件,並構造鏈。職責鏈模式主要包含兩種角色 第一種,抽象職責類。第二種,具體職責類。以員工請求加薪為例。如果員工請求加薪小於500,那麼經理可以直接處理,如果...