意圖:
為某個請求建立一個物件鏈,每個物件依次檢查此請求,並對其進行處理,或者將它傳給鏈中的下一個物件
關鍵程式碼:
責任鏈中每個物件都擁有同一個父類(或介面)
應用例項:
- 訊息過濾器,許可權攔截器
- 使用者發帖內容進行廣告過濾,涉黃過濾,敏感詞過濾等
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 協議》,轉載必須註明作者和本文連結