责任链模式(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:
// [执行广告过滤]
// [执行脚本过滤]
// [执行日志记录]
// 正常内容,**内容