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
留言分享你的想法!
avatar-img
KH Huang的沙龍
37會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
KH Huang的沙龍的其他內容
2023/09/06
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
2023/09/06
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
2023/09/03
嗨,大家好!今天我們來聊聊什麼是延遲評估模式,它的好處是啥,還有在 Go 裡面是怎麼玩的。
Thumbnail
2023/09/03
嗨,大家好!今天我們來聊聊什麼是延遲評估模式,它的好處是啥,還有在 Go 裡面是怎麼玩的。
Thumbnail
2023/09/03
在許多大型系統中,不同的子系統需要共享和修改某些資訊以達到一個共同目的。在這種情況下,傳統的方法可能會造成混亂和冗餘。這時,黑板模式出現了,它提供了一個統一的架構,讓這些子系統可以有效率地協作。
Thumbnail
2023/09/03
在許多大型系統中,不同的子系統需要共享和修改某些資訊以達到一個共同目的。在這種情況下,傳統的方法可能會造成混亂和冗餘。這時,黑板模式出現了,它提供了一個統一的架構,讓這些子系統可以有效率地協作。
Thumbnail
看更多
你可能也想看
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 系統運行的過程中難免會發生一點小插曲, 意外難免, 但
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 系統運行的過程中難免會發生一點小插曲, 意外難免, 但
Thumbnail
👨‍💻簡介 昨天講到Goroutine的橋梁aka傳話筒 — Channel,那要怎麼知道對方有收到訊息,我的紙條有送到對方手上呢? 今天就是要來介紹幾種Goroutine的確定完成工作的幾種方式。
Thumbnail
👨‍💻簡介 昨天講到Goroutine的橋梁aka傳話筒 — Channel,那要怎麼知道對方有收到訊息,我的紙條有送到對方手上呢? 今天就是要來介紹幾種Goroutine的確定完成工作的幾種方式。
Thumbnail
👨‍💻簡介 昨天講到Goroutine有稍微簡單介紹Channel,Channel是Go語言中極為重要的併發通訊機制,它就像是不同goroutines之間的話筒,允許它們安全地傳遞資料和信息。這個強大的工具使得Go語言在處理併發任務時非常優雅和高效。
Thumbnail
👨‍💻簡介 昨天講到Goroutine有稍微簡單介紹Channel,Channel是Go語言中極為重要的併發通訊機制,它就像是不同goroutines之間的話筒,允許它們安全地傳遞資料和信息。這個強大的工具使得Go語言在處理併發任務時非常優雅和高效。
Thumbnail
嗨嗨,各位碼農們!我們都知道,有些“魔法”在開發過程中是非常有用的,今天我要和大家聊聊的就是 Gin 中的這種“魔法”:中間件 (Middleware)!
Thumbnail
嗨嗨,各位碼農們!我們都知道,有些“魔法”在開發過程中是非常有用的,今天我要和大家聊聊的就是 Gin 中的這種“魔法”:中間件 (Middleware)!
Thumbnail
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
在設計軟體應用程式時,為了保持模組化、可維護性和可擴展性,開發人員通常會使用多層架構。3-tier(三層)架構是其中最常見的一種,它基本上分為三個主要層次:表示層、邏輯層和數據層。
Thumbnail
在設計軟體應用程式時,為了保持模組化、可維護性和可擴展性,開發人員通常會使用多層架構。3-tier(三層)架構是其中最常見的一種,它基本上分為三個主要層次:表示層、邏輯層和數據層。
Thumbnail
當我們在處理一連串的事件或請求時,責任鏈模式 (Chain of Responsibility Pattern) 就像一位隱形的助手🤖,幫助我們將這些請求一一分發給合適的處理者。
Thumbnail
當我們在處理一連串的事件或請求時,責任鏈模式 (Chain of Responsibility Pattern) 就像一位隱形的助手🤖,幫助我們將這些請求一一分發給合適的處理者。
Thumbnail
嗨,各位!想像一下你住在一棟大樓里,每次有人要進來時,他們得先經過樓下的門禁員檢查,這樣才能確保大樓的安全。在程式設計的世界裡,我們也有類似的機制,那就是「代理模式 (Proxy Pattern)」!
Thumbnail
嗨,各位!想像一下你住在一棟大樓里,每次有人要進來時,他們得先經過樓下的門禁員檢查,這樣才能確保大樓的安全。在程式設計的世界裡,我們也有類似的機制,那就是「代理模式 (Proxy Pattern)」!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News