责任链模式定义

责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
责任链的传递

我的理解

举个例子,在HTTP请求过来时,会有多个处理这进行处理,比如权限验证处理,日志处理,业务 处理等等。如果采用非职责链模式的话,我们客户端,会调用权限处理模块、日志 处理模块等去处理该请求,即定义中说的与多个请求矗立着耦合在一起。
采用责任链模式,即我们客户端,调用权限处理模块处理后,权限处理模块会自动调用它后面的处理者。每一个处理者都有下一个处理者的引用。这样,客户端,只需要要调用责任链中的第一个,就可以延着这条链传递,直到处理完毕。

代码例子

下面的这个例子,当请求过来时,权限模块先处理,然后交给日志模块去处理(仅仅打印信息)

package main

import (
	"fmt"
)

func main() {

	//组装责任链
	logHandler := new(LogHandler)
	authoHandler := new(AuthoHandler)
	authoHandler.SetNext(logHandler)

	//责任链间传递的信息
	info := RequestInfo{Name: "test"}

	//客户调用责任链的入口责任
	authoHandler.Handle(info)

}

type RequestInfo struct {
	Name string
}

//责任链接口,所有的责任链实现者都应实现该接口
type Handler interface {
	//责任链中的处理方法
	Handle(info RequestInfo)
	//设置下一个
	SetNext(handler Handler)
	//获取下一个
	GetNext()(next Handler,ok bool)
}

//记录日志
type LogHandler struct {
	next Handler
}

func (handler *LogHandler) Handle(info RequestInfo)  {
	fmt.Println("日志记录:",info.Name)
	//接着调用后续处理
	if next,ok := handler.GetNext();ok{
		next.Handle(info)
	}
}

func (handler *LogHandler) SetNext(next Handler) {
	handler.next = next
}

func (handler *LogHandler) GetNext() (next Handler,ok bool) {
	if handler.next != nil{
		return handler.next,true
	}
	return nil,false
}

//权限验证
type AuthoHandler struct {
	next Handler
}

func (handler *AuthoHandler) Handle(info RequestInfo)  {
	fmt.Println("权限验证:",info.Name)
	if next,ok := handler.GetNext();ok{
		next.Handle(info)
	}
}

func (handler *AuthoHandler) SetNext(next Handler) {
	handler.next = next
}

func (handler *AuthoHandler) GetNext() (next Handler,ok bool) {
	if handler.next != nil{
		return handler.next,true
	}
	return nil,false
}

结果

控制台打印结果

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐