Go 如何實現責任鏈模式

    責任鏈模式(Chain of Responsibility)是一種行爲設計模式,其主要思想是創建多個對象並通過每個對象對其封裝的方式檢查一個順序,然後決定哪一個對象應該處理這個請求。這種模式可以動態地修改處理順序。

簡單來說,責任鏈模式就是一個對象鏈對請求進行處理,但實際的處理者是其中的一個對象,而不是全部。在責任鏈模式中,請求者並不知道處理者是哪一個,只知道請求在責任鏈中被處理了。處理者也只知道處理了請求,而並不知道自己是責任鏈中的哪一個環節。

這個模式的好處是減少了請求者與處理者之間的耦合,提高了軟件的健壯性。同時當處理邏輯發生改變時,只需要調整處理順序,或者增加 / 刪除處理者,而不需要修改原有代碼,符合開閉原則。

以下是 Go 如何實現責任鏈模式的示例:

    首先,我們通過定義接口來定義一個請求的處理者

type Handler interface {
  ServeHTTP(content string) string
}

其次,我們實現幾個具體的處理者。

type EmailHandler struct {
  Next Handler
}
func (h *EmailHandler) ServeHTTP(content string) string {
  if strings.Contains(content, "email") {
    return "Email handled"
  }
  if h.Next != nil {
    return h.Next.ServeHTTP(content)
  }
  return "End of chain, no handler for " + content
}
type PhoneHandler struct {
  Next Handler
}
func (h *PhoneHandler) ServeHTTP(content string) string {
  if strings.Contains(content, "phone") {
    return "Phone handled"
  }
  if h.Next != nil {
    return h.Next.ServeHTTP(content)
  }
  return "End of chain, no handler for " + content
}

在此例中,如果發送過來的請求含有 "email",則 EmailHandler 會處理這個請求,如果請求包含 "phone",則 PhoneHandler 會處理這個請求。如果都不包含,則返回沒有找到處理器的信息。通過 Next 字段,我們將處理器鏈接起來,形成了一條責任鏈。

測試代碼如下:

func main() {
  emailHandler := &EmailHandler{
    Next: nil,
  }
  phoneHandler := &PhoneHandler{
    Next: emailHandler,
  }
  fmt.Println(phoneHandler.ServeHTTP("email"))
}

當執行上述的 main 方法時,首先是 PhoneHandler 接收到請求,但請求中並沒有包含 "phone",因此它會調用 Next 即 EmailHandler 的 ServeHTTP 方法,由 EmailHandler 來處理這個請求,因此控制檯輸出 "Email handled"。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/nhZJw1xqfqVrPfP1JJoJPg