2023-08-27|閱讀時間 ‧ 約 4 分鐘

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

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 ...


小結

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

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.