Golang - Design Pattern #16: 責任鏈模式(Chain of Responsibility)

閱讀時間約 3 分鐘
raw-image
🔗 連續處理請求 🔗

當我們在處理一連串的事件或請求時,責任鏈模式 (Chain of Responsibility Pattern) 就像一位隱形的助手🤖,幫助我們將這些請求一一分發給合適的處理者。


責任鏈模式

這個模式的核心概念是:當一個請求出現時,由多個對象組成的鏈依次處理這一請求。每個對象決定自己能否處理,若可以則處理,否則傳遞給下一個對象。


實際例子

📝 日誌系統

想像一下,我們有一個日誌系統,根據不同級別(如ERROR、WARN、INFO)將訊息輸出到不同地方(例如:控制台、文件、郵件)。


type Logger interface {
SetNext(Logger)
LogMessage(level int, message string)
}

type ConsoleLogger struct {
next Logger
}

func (c *ConsoleLogger) SetNext(next Logger) {
c.next = next
}

func (c *ConsoleLogger) LogMessage(level int, message string) {
if level == 1 {
fmt.Println("[Console]: " + message)
} else if c.next != nil {
c.next.LogMessage(level, message)
}
}

type FileLogger struct {
next Logger
}

// ... FileLogger的實現類似於ConsoleLogger ...


🙏 請假系統

員工請假流程中,先由直屬主管審核,若超過3天則需部門經理審核,若超過7天則需總經理審核。


type Handler interface {
SetNext(Handler)
HandleRequest(days int)
}

type Supervisor struct {
next Handler
}

func (s *Supervisor) SetNext(next Handler) {
s.next = next
}

func (s *Supervisor) HandleRequest(days int) {
if days <= 3 {
fmt.Println("Supervisor approves leave.")
} else if s.next != nil {
s.next.HandleRequest(days)
}
}

type Manager struct {
next Handler
}

// ... Manager的實現類似於Supervisor ...


小結

責任鏈模式提供了一個出色的方式來解耦請求發送者和接收者。它允許多個物件處理同一請求,或者自動傳遞給鏈中的下一物件。當你的應用中出現多個物件需要處理同一請求,且確切的處理者不確定或者處理方式可能動態變化時,考慮使用這個模式吧!🚀

avatar-img
31會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
KH Huang的沙龍 的其他內容
大家有沒有遇到過這種情況:當應用程式使用過多資源,如記憶體或 CPU 時,整個系統的性能直線下降?😰 不得不說,資源的有效管理在軟體開發中真的超級重要!這就是享元模式 (Flyweight Pattern) 大顯身手的時候了!
你知道那種感覺嗎?當你想從複雜的家電系統中只開啟你的電視和音響,卻需要找一大堆遙控器才能完成。外觀模式(Facade)就是這樣的解決方案!它可以幫助我們簡化複雜系統的操作,提供一個單一、簡單的接口。
你還記得在學校時代,當兩位朋友吵架時,有時會有第三者出來做調解嗎?在程式設計中,我們有一種模式就像那位調解者,幫助兩個物件之間保持距離,這就是仲介者模式( Mediator Pattern )!
你還記得那次與朋友一起的燒烤派對,大家輪流挑選食材放到烤架上烤嗎?這就好比使用迭代器模式 (Iterator Pattern) 來遍歷集合!讓我們一起來看看它是如何工作的,以及為什麼它如此有用。
你有沒有試著畫出家族樹或公司組織架構圖呢?如果有,那你其實已經初步了解「組合模式 (Composite Pattern)」了!這種模式就是用來處理這類包含部分和整體的樹狀結構。這篇文章,我們就來深入探討它是如何運作的。
嗨,各位!想像一下你住在一棟大樓里,每次有人要進來時,他們得先經過樓下的門禁員檢查,這樣才能確保大樓的安全。在程式設計的世界裡,我們也有類似的機制,那就是「代理模式 (Proxy Pattern)」!
大家有沒有遇到過這種情況:當應用程式使用過多資源,如記憶體或 CPU 時,整個系統的性能直線下降?😰 不得不說,資源的有效管理在軟體開發中真的超級重要!這就是享元模式 (Flyweight Pattern) 大顯身手的時候了!
你知道那種感覺嗎?當你想從複雜的家電系統中只開啟你的電視和音響,卻需要找一大堆遙控器才能完成。外觀模式(Facade)就是這樣的解決方案!它可以幫助我們簡化複雜系統的操作,提供一個單一、簡單的接口。
你還記得在學校時代,當兩位朋友吵架時,有時會有第三者出來做調解嗎?在程式設計中,我們有一種模式就像那位調解者,幫助兩個物件之間保持距離,這就是仲介者模式( Mediator Pattern )!
你還記得那次與朋友一起的燒烤派對,大家輪流挑選食材放到烤架上烤嗎?這就好比使用迭代器模式 (Iterator Pattern) 來遍歷集合!讓我們一起來看看它是如何工作的,以及為什麼它如此有用。
你有沒有試著畫出家族樹或公司組織架構圖呢?如果有,那你其實已經初步了解「組合模式 (Composite Pattern)」了!這種模式就是用來處理這類包含部分和整體的樹狀結構。這篇文章,我們就來深入探討它是如何運作的。
嗨,各位!想像一下你住在一棟大樓里,每次有人要進來時,他們得先經過樓下的門禁員檢查,這樣才能確保大樓的安全。在程式設計的世界裡,我們也有類似的機制,那就是「代理模式 (Proxy Pattern)」!
你可能也想看
Google News 追蹤
想像一下你在公司遇到一個棘手的問題。你會怎麼做?通常的做法是先跟你的主管報告,發現他解決不了,就再往上報告給更高層的主管,如果還是解決不了就再往上報告給更高層,這樣層層往上,直到有人可以處理為止。這就是「責任鏈模式」的概念,將任務一步步傳遞,直到問題被解決。 什麼是責任鏈模式? 責任鏈模式是
Thumbnail
本章節帶領讀者了解 Kotlin 的流程控制語法,包括條件判斷、當做三元運算子使用的 if 表達式、用來替代 switch 語句的 when 語句、用於迴圈運作的 for 和 while 語句,以及控制迴圈執行流程的語句和標籤概念。該章節目的在於讓讀者深入掌握流程控制功能,進一步提升編程技巧。
※ 觀察者模式 定義: 觀察者模式(Observer Pattern)是一種設計模式,涉及兩個主要角色:觀察者(Observers)和被觀察者(Subject)。在這種模式中,一群觀察者訂閱並觀察某個被觀察的對象。當被觀察者的狀態發生改變時,它會通知所有觀察者,讓他們知曉並作出相應的反應。這種模
※ 設計模式的五大精神介紹(S.O.L.I.D): ※ 第一大精神 — S:單一職責原則(Single responsibility principle, SRP) ※ 定義: 每個物件,不管是類別或函數,都應該只負責一項功能。 當需求改變時,僅需改相關的區域,而不需要更動其他不相關的部分
Thumbnail
呈上次使用logging來撰寫日誌,利用類別包裝的方式,可實現多個日誌紀錄器,但發現這樣就失去它原先,可以回傳是誰呼叫他並記錄行數的功能。 [Python]使用logging創建兩個以上的日誌紀錄 若開啟函式名稱、行數及訊息的功能,就會像這樣,幾乎都是記錄到,我定義中類別的函式
※ 何謂巢狀迴圈(NESTD LOOP): 指的是一個迴圈內包含另一個迴圈的結構。在程式設計中,這種結構常用於需要進行多層次迭代的場合,例如處理多維數組、逐行逐列處理表格資料等。 ※ 例子:九九乘法表 說明: 外層迴圈:for (let i = 1; i <= 9; i = i + 1) 這
※ 迴圈(for loop)介紹: 迴圈的用途是重複執行程式碼,只要條件滿足,就會執行特定的動作。 for (let i = 0; i < 10; i = i + 1) { console.log(i); } 說明: for:對於。 let:因為迭代器的數值會一直改變所以要用let
Thumbnail
這篇文章,會帶著大家複習以前學過的遞回框架, 並且鏈結串列的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 遞回框架 尋找共通模式(common pattern),對應到演算法的General case 確立初始條件(initial conditio
Thumbnail
在日常中,常有重複性相當高的事情,不斷地重複在做,重複的事做久就會慢慢變成是一個習慣,這個習慣就會讓人下意識地完成一些事情。 習慣是一種自動化的行為模式,這些行為模式在重複進行的過程中變得固定且容易自動化。 在Python程式語言中,for迴圈就類似這種概念
想像一下你在公司遇到一個棘手的問題。你會怎麼做?通常的做法是先跟你的主管報告,發現他解決不了,就再往上報告給更高層的主管,如果還是解決不了就再往上報告給更高層,這樣層層往上,直到有人可以處理為止。這就是「責任鏈模式」的概念,將任務一步步傳遞,直到問題被解決。 什麼是責任鏈模式? 責任鏈模式是
Thumbnail
本章節帶領讀者了解 Kotlin 的流程控制語法,包括條件判斷、當做三元運算子使用的 if 表達式、用來替代 switch 語句的 when 語句、用於迴圈運作的 for 和 while 語句,以及控制迴圈執行流程的語句和標籤概念。該章節目的在於讓讀者深入掌握流程控制功能,進一步提升編程技巧。
※ 觀察者模式 定義: 觀察者模式(Observer Pattern)是一種設計模式,涉及兩個主要角色:觀察者(Observers)和被觀察者(Subject)。在這種模式中,一群觀察者訂閱並觀察某個被觀察的對象。當被觀察者的狀態發生改變時,它會通知所有觀察者,讓他們知曉並作出相應的反應。這種模
※ 設計模式的五大精神介紹(S.O.L.I.D): ※ 第一大精神 — S:單一職責原則(Single responsibility principle, SRP) ※ 定義: 每個物件,不管是類別或函數,都應該只負責一項功能。 當需求改變時,僅需改相關的區域,而不需要更動其他不相關的部分
Thumbnail
呈上次使用logging來撰寫日誌,利用類別包裝的方式,可實現多個日誌紀錄器,但發現這樣就失去它原先,可以回傳是誰呼叫他並記錄行數的功能。 [Python]使用logging創建兩個以上的日誌紀錄 若開啟函式名稱、行數及訊息的功能,就會像這樣,幾乎都是記錄到,我定義中類別的函式
※ 何謂巢狀迴圈(NESTD LOOP): 指的是一個迴圈內包含另一個迴圈的結構。在程式設計中,這種結構常用於需要進行多層次迭代的場合,例如處理多維數組、逐行逐列處理表格資料等。 ※ 例子:九九乘法表 說明: 外層迴圈:for (let i = 1; i <= 9; i = i + 1) 這
※ 迴圈(for loop)介紹: 迴圈的用途是重複執行程式碼,只要條件滿足,就會執行特定的動作。 for (let i = 0; i < 10; i = i + 1) { console.log(i); } 說明: for:對於。 let:因為迭代器的數值會一直改變所以要用let
Thumbnail
這篇文章,會帶著大家複習以前學過的遞回框架, 並且鏈結串列的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 遞回框架 尋找共通模式(common pattern),對應到演算法的General case 確立初始條件(initial conditio
Thumbnail
在日常中,常有重複性相當高的事情,不斷地重複在做,重複的事做久就會慢慢變成是一個習慣,這個習慣就會讓人下意識地完成一些事情。 習慣是一種自動化的行為模式,這些行為模式在重複進行的過程中變得固定且容易自動化。 在Python程式語言中,for迴圈就類似這種概念