Go 實現常用設計模式(十)責任鏈模式

pibigstar發表於2019-09-07

意圖:
為某個請求建立一個物件鏈,每個物件依次檢查此請求,並對其進行處理,或者將它傳給鏈中的下一個物件

關鍵程式碼:
責任鏈中每個物件都擁有同一個父類(或介面)

應用例項:

  1. 訊息過濾器,許可權攔截器
  2. 使用者發帖內容進行廣告過濾,涉黃過濾,敏感詞過濾等

Go實現責任鏈模式

package chain

import (
    "fmt"
    "strings"
)

type Handler interface {
    Handle(content string)
    next(handler Handler, content string)
}

// 廣告過濾
type AdHandler struct {
    handler Handler
}

func (ad *AdHandler) Handle(content string) {
    fmt.Println("執行廣告過濾。。。")
    newContent := strings.Replace(content, "廣告", "**", 1)
    fmt.Println(newContent)
    ad.next(ad.handler, newContent)
}

func (ad *AdHandler) next(handler Handler, content string) {
    if ad.handler != nil {
        ad.handler.Handle(content)
    }
}

// 涉黃過濾
type YellowHandler struct {
    handler Handler
}

func (yellow *YellowHandler) Handle(content string) {
    fmt.Println("執行涉黃過濾。。。")
    newContent := strings.Replace(content, "涉黃", "**", 1)
    fmt.Println(newContent)
    yellow.next(yellow.handler, newContent)
}

func (yellow *YellowHandler) next(handler Handler, content string) {
    if yellow.handler != nil {
        yellow.handler.Handle(content)
    }
}

// 敏感詞過濾
type SensitiveHandler struct {
    handler Handler
}

func (sensitive *SensitiveHandler) Handle(content string) {
    fmt.Println("執行敏感詞過濾。。。")
    newContent := strings.Replace(content, "敏感詞", "***", 1)
    fmt.Println(newContent)
    sensitive.next(sensitive.handler, newContent)
}

func (sensitive *SensitiveHandler) next(handler Handler, content string) {
    if sensitive.handler != nil {
        sensitive.handler.Handle(content)
    }
}

測試用例

package chain

import "testing"

func TestChain(t *testing.T) {
    adHandler := &AdHandler{}
    yellowHandler := &YellowHandler{}
    sensitiveHandler := &SensitiveHandler{}
    // 將責任鏈串起來
    adHandler.handler = yellowHandler
    yellowHandler.handler = sensitiveHandler

    adHandler.Handle("我是正常內容,我是廣告,我是涉黃,我是敏感詞,我是正常內容")
}

具體程式碼

更詳細的程式碼可參考:https://github.com/pibigstar/go-demo 裡面包含了 Go 常用的設計模式、Go 面試易錯點、簡單的小專案(區塊鏈,爬蟲等)、還有各種第三方的對接(redis、sms、nsq、elsticsearch、alipay、oss...),如果對你有所幫助,請給個 Star,你的支援,是我最大的動力!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章