责任链模式(Chain Design Pattern)

责任链模式为请求创建了一个接受者对象的链,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者。职责链模式用于分离不同职责,并且动态组合相关职责。

Request ——> ProcessorA ——> ProcessorB ——> ProcessorC ——> ...

代码示例

package chain

import (
    "fmt"
    "strings"
)

type Handler interface {
    Handle(content string)
}

type LogHandler struct {
    NextHandler Handler
}

//日志记录
func (h LogHandler) Handle(content string) {
    fmt.Println("[执行日志记录]")
    fmt.Println(content)
    if h.NextHandler != nil {
        h.NextHandler.Handle(content)
    }
}

//广告过滤
type AdFilterHandler struct {
    NextHandler Handler
}

func (h AdFilterHandler) Handle(content string) {
    fmt.Println("[执行广告过滤]")
    newContent := strings.ReplaceAll(content, "广告", "**")
    if h.NextHandler != nil {
        h.NextHandler.Handle(newContent)
    }
}

//过滤脚本字符
type ScriptFilterHandler struct {
    NextHandler Handler
}

func (h ScriptFilterHandler) Handle(content string) {
    fmt.Println("[执行脚本过滤]")
    newContent := strings.ReplaceAll(content, "script", "")
    if h.NextHandler != nil {
        h.NextHandler.Handle(newContent)
    }
}

调用:

log := &LogHandler{}
script := ScriptFilterHandler{NextHandler: log}
ad := AdFilterHandler{NextHandler: script}

content := "正常内容,广告内容 script"
ad.Handle(content)

// Output:
// [执行广告过滤]
// [执行脚本过滤]
// [执行日志记录]
// 正常内容,**内容

results matching ""

    No results matching ""