C 職責鏈模式

2021-09-20 11:47:44 字數 2179 閱讀 3750

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

uml 結構圖:

優點:缺點:

請假 - 流程處理

混跡職場,從來都身不由己,誰不想在繁忙的工作裡偷得浮生半日閒。但請假從來都是一門技術活,拼技術,更拼情商!

無論如何,只要你願意,從感冒到被綁架,一定能找出一萬種理由:

彪悍的人生不需要解釋,如果沒有過這種請假經歷,就不是職場老司機。。。

當員工發出請假請求時,鏈中的處理者可以對請求作出響應或者將其傳遞給上級。每個處理者都有自己的一套規則,而這套規則是他們可以批准的。審批流程:經理(1 天及以下) -> 總監(3 天及以下) -> 總裁(7 天為界限)。

建立抽象處理者

抽象處理者除了提供乙個處理請假的介面之外,還有乙個很關鍵的地方就是定義後繼者,這樣便可以構建一條鏈:

// handler.h

#ifndef handler_h

#define handler_h

#include

// 抽象處理者

class ihandler

virtual ~ihandler() {}

void setsuccessor(ihandler *successor)

virtual

void handlerequest(float days) = 0;

protected:

ihandler *m_psuccessor; // 後繼者

};#endif // handler_h

建立具體處理者具體處理者包含 manager、director、ceo,它們的實現基本相同,只是批准的天數不一樣:

// concrete_handler.h

#ifndef concrete_handler_h

#define concrete_handler_h

#include "handler.h"

// 經理

class manager : public ihandler

~manager() {}

virtual

void handlerequest(float days) override else

}};// 總監

class director : public ihandler

~director() {}

virtual

void handlerequest(float days) override else

}};// 總裁

class ceo : public ihandler

~ceo() {}

virtual

void handlerequest(float days) override else

}};#endif // concrete_handler_h

注意:由於 ceo 位於最高層(處於鏈的末尾),所以請求到此結束,不會繼續向下傳遞。

建立客戶端

開始請假,說出你的理由:

// main.cpp

#include

"concrete_handler.h"

#ifndef safe_delete

#define safe_delete(p) }

#endif

int main()

輸出如下:

manager 批准了 1 天假

director 批准了 2 天假

ceo 批准了 5 天假

給你放長假,以後不用來上班啦!

c 職責鏈模式

職 責鏈模式 使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處 理它為止。其思想很簡單,考慮員工要求加薪。公司的管理者一共有 總經理 總監 經理,如果乙個員工要求加薪,應該向主管的經理申請,如果加薪的數量 在經理的...

設計模式 職責鏈模式 C

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

C 設計模式 職責鏈模式

目錄 基本概念 與例項 在哪種地方使用 職責鏈模式 chain of responsibility 時多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連線成一條鏈,並沿著這條鏈條傳遞該請求,直到有乙個物件處理它為止。這裡發出這個請求的客戶端並不知道這當中的哪個物件最終...