0

0

Golang责任链模式写法 请求链式传递处理

P粉602998670

P粉602998670

发布时间:2025-08-19 14:15:01

|

469人浏览过

|

来源于php中文网

原创

责任链模式通过链式处理器解耦请求发送与接收,Go中可定义Handler接口及Request结构体,实现SetNext与Handle方法,构建日志、验证、处理等可插拔环节,请求沿链传递直至被处理或终止,符合开闭原则,需注意nil判断与处理状态管理。

golang责任链模式写法 请求链式传递处理

在 Go 语言中使用责任链模式,可以让多个处理器依次处理请求,每个处理器可以选择处理请求或将其传递给下一个处理器。这种模式适用于日志处理、中间件、审批流程等场景,核心是解耦请求发送者和接收者。

定义请求和处理器接口

首先定义一个请求结构体和处理器接口,所有处理器都实现相同的接口,便于链式调用。

type Request struct {
  Data string
  Handled bool // 标记是否已被处理
}

type Handler interface {
  SetNext(handler Handler) Handler
  Handle(req *Request)
}

实现具体处理器

每个处理器持有下一个处理器的引用,可以在处理逻辑前后决定是否继续传递请求。

type ConcreteHandler struct {
  next Handler
  name string
}

func (h *ConcreteHandler) SetNext(handler Handler) Handler {
  h.next = handler
  return handler // 支持链式调用
}

func (h *ConcreteHandler) Handle(req *Request) {
  if req.Handled {
    return // 已被处理,跳过
  }
  fmt.Printf("[%s] 正在处理: %s\n", h.name, req.Data)
  // 模拟处理逻辑
  if h.name == "Logger" {
    req.Data = "[logged] " + req.Data
  } else if h.name == "Validator" && strings.Contains(req.Data, "invalid") {
    fmt.Printf("[%s] 拒绝请求\n", h.name)
    req.Handled = true
    return
  }
  req.Handled = true // 标记为已处理(可选)
  if h.next != nil {
    h.next.Handle(req)
  }
}

构建和使用责任链

通过链式调用组装处理器,请求会依次传递,直到被处理或链结束。

Reword
Reword

AI文章写作,一个会思考的编辑

下载

立即学习go语言免费学习笔记(深入)”;

func main() {
  logger := &ConcreteHandler{name: "Logger"}
  validator := &ConcreteHandler{name: "Validator"}
  processor := &ConcreteHandler{name: "Processor"}

  // 链式组装
  logger.SetNext(validator).SetNext(processor)

  req := &Request{Data: "valid data"}
  logger.Handle(req)

  // 输出:
  // [Logger] 正在处理: valid data
  // [Validator] 正在处理: [logged] valid data
  // [Processor] 正在处理: [logged] valid data
}

责任链模式让处理逻辑可插拔,新增处理器不影响原有代码,符合开闭原则。关键是每个处理器只关心自身职责,并决定是否转发请求。基本上就这些,不复杂但容易忽略细节比如 nil 判断和处理状态管理。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

225

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

336

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

206

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

191

2025.06.17

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

177

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号