菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
2897
1

Go 实现常用设计模式(十)责任链模式

原创
05/13 14:22
阅读数 2843

责任链模式 (chain)

意图:
为某个请求创建一个对象链,每个对象依次检查此请求,并对其进行处理,或者将它传给链中的下一个对象

关键代码:
责任链中每个对象都拥有同一个父类(或接口)

应用实例:

  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,你的支持,是我最大的动力!

发表评论

0/200
2897 点赞
1 评论
收藏
为你推荐 换一批