责任链模式

发布时间 2023-09-17 10:37:06作者: 王景迁

为请求创建一个对象链,每个对象依次处理请求并传给链中的下一个对象。
责任链中每个对象都拥有同一个父类(或接口)。

package main

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 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)
	}
}

func main() {
	adHandler := &AdHandler{}
	sensitiveHandler := &SensitiveHandler{}
	adHandler.handler = sensitiveHandler

	str := "我是正常内容,我是广告,我是敏感词,我是正常内容"
	fmt.Println(str)
	adHandler.Handle(str)
}

输出结果

我是正常内容,我是广告,我是敏感词,我是正常内容
执行广告过滤。。。
我是正常内容,我是**,我是敏感词,我是正常内容
执行敏感词过滤。。。
我是正常内容,我是**,我是***,我是正常内容

参考资料

https://learnku.com/articles/33708