首页 > 后端开发 > Golang > 正文

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

P粉602998670
发布: 2025-08-19 14:15:01
原创
463人浏览过
责任链模式通过链式处理器解耦请求发送与接收,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)
  }
}

构建和使用责任链

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

语鲸
语鲸

AI智能阅读辅助工具

语鲸 252
查看详情 语鲸

立即学习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责任链模式写法 请求链式传递处理的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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