商城首页欢迎来到中国正版软件门户

您的位置:首页 >Golang责任链模式实现请求链式处理

Golang责任链模式实现请求链式处理

  发布于2025-10-14 阅读(0)

扫一扫,手机访问

责任链模式通过链式处理器解耦请求发送与接收,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)
  }
}

构建和使用责任链

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

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 判断和处理状态管理。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注