go: Chain of Responsibility Pattern

项目结构:

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Chain of Responsibility Pattern  责任链模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/21 20:48
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : repair.go
*/
package domain
 
// 维修类型常量(严格定义业务等级)
const (
    RepairTypeSimple  = "简单维修" // 初级技师
    RepairTypeComplex = "复杂维修" // 高级技师
    RepairTypeMajor   = "重大维修" // 维修主管
)
 
// RepairRequest 维修请求实体(企业级标准:字段完整、不可变)
type RepairRequest struct {
    CustomerName string // 客户姓名
    RepairType   string // 维修类型
    Content      string // 维修详情
}
Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Chain of Responsibility Pattern  责任链模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/21 20:48
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : base.go
*/
package handler
 
import "godesginpattern/chain/domain"
 
// RepairHandler 责任链核心接口(企业级标准:契约定义)
type RepairHandler interface {
    SetNext(handler RepairHandler) RepairHandler
    HandleRequest(req *domain.RepairRequest) bool
}
 
// BaseRepairHandler 基础处理者(封装Next指针,所有处理者继承)
type BaseRepairHandler struct {
    next RepairHandler
}
 
// SetNext 链式设置下一级处理者
func (b *BaseRepairHandler) SetNext(handler RepairHandler) RepairHandler {
    b.next = handler
    return handler
}
 
// nextHandle 公共方法:传递给下一级处理
func (b *BaseRepairHandler) nextHandle(req *domain.RepairRequest) bool {
    if b.next != nil {
        return b.next.HandleRequest(req)
    }
    return false
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Chain of Responsibility Pattern  责任链模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/21 20:49
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : junior.go
*/
package handler
 
import (
    "fmt"
    "godesginpattern/chain/domain"
)
 
// JuniorTechnician 初级珠宝技师:仅处理简单维修
type JuniorTechnician struct {
    BaseRepairHandler
}
 
func (j *JuniorTechnician) HandleRequest(req *domain.RepairRequest) bool {
    if req.RepairType == domain.RepairTypeSimple {
        fmt.Printf("【初级技师】处理客户%s的请求:%s(维修内容:%s)✅\n",
            req.CustomerName, req.RepairType, req.Content)
        return true
    }
    // 无法处理,交给下一级
    return j.nextHandle(req)
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Chain of Responsibility Pattern  责任链模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/21 20:49
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : senior.go
*/
package handler
 
import (
    "fmt"
    "godesginpattern/chain/domain"
)
 
// SeniorTechnician 高级珠宝技师:仅处理复杂维修
type SeniorTechnician struct {
    BaseRepairHandler
}
 
func (s *SeniorTechnician) HandleRequest(req *domain.RepairRequest) bool {
    if req.RepairType == domain.RepairTypeComplex {
        fmt.Printf("【高级技师】处理客户%s的请求:%s(维修内容:%s)✅\n",
            req.CustomerName, req.RepairType, req.Content)
        return true
    }
    return s.nextHandle(req)
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Chain of Responsibility Pattern  责任链模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/21 20:49
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : supervisor.go
*/
package handler
 
import (
    "fmt"
    "godesginpattern/chain/domain"
)
 
// RepairSupervisor 维修主管:仅处理重大维修
type RepairSupervisor struct {
    BaseRepairHandler
}
 
func (r *RepairSupervisor) HandleRequest(req *domain.RepairRequest) bool {
    if req.RepairType == domain.RepairTypeMajor {
        fmt.Printf("【维修主管】处理客户%s的请求:%s(维修内容:%s)✅\n",
            req.CustomerName, req.RepairType, req.Content)
        return true
    }
    return r.nextHandle(req)
}
Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Chain of Responsibility Pattern  责任链模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/21 20:49
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : repair_service.go
*/
package service
 
import (
    "fmt"
    "godesginpattern/chain/domain"
    "godesginpattern/chain/handler"
)
 
// RepairService 维修服务(企业级:对外唯一入口)
type RepairService struct {
    chainHandler handler.RepairHandler // 责任链入口
}
 
// NewRepairService 创建服务(初始化责任链)
func NewRepairService() *RepairService {
    // 1. 创建处理者
    junior := &handler.JuniorTechnician{}
    senior := &handler.SeniorTechnician{}
    supervisor := &handler.RepairSupervisor{}
 
    // 2. 构建标准责任链:初级 → 高级 → 主管
    junior.SetNext(senior).SetNext(supervisor)
 
    return &RepairService{
        chainHandler: junior,
    }
}
 
// SubmitRepair 提交维修请求(对外服务方法)
func (s *RepairService) SubmitRepair(req *domain.RepairRequest) {
    fmt.Println("===== 客户提交维修请求 =====")
    success := s.chainHandler.HandleRequest(req)
    if !success {
        fmt.Printf("❌ 无法处理客户%s的请求:%s(维修内容:%s)\n",
            req.CustomerName, req.RepairType, req.Content)
    }
    fmt.Println()
} 

调用::

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Chain of Responsibility Pattern  责任链模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/21 20:51
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : chainbll.go
 
Chain/
├── domain/          # 领域实体层(核心数据模型)
│   └── repair.go    # 维修请求实体、常量定义
├── handler/         # 责任链处理层(接口+实现)
│   ├── base.go      # 基础处理者(公共逻辑)
│   ├── junior.go    # 初级技师
│   ├── senior.go    # 高级技师
│   └── supervisor.go# 维修主管
├── service/         # 业务服务层(责任链构建+调度)
│   └── repair_service.go
├── go.mod           # Go 模块文件
└── main.go          # 程序入口(测试用例)
*/
package bll
 
import (
    "godesginpattern/chain/domain"
    "godesginpattern/chain/service"
)
 
func ChainMain() {
    // 初始化维修服务
    repairService := service.NewRepairService()
 
    // 测试1:简单维修
    req1 := &domain.RepairRequest{
        CustomerName: "张先生",
        RepairType:   domain.RepairTypeSimple,
        Content:      "戒指清洗+抛光",
    }
    repairService.SubmitRepair(req1)
 
    // 测试2:复杂维修
    req2 := &domain.RepairRequest{
        CustomerName: "李女士",
        RepairType:   domain.RepairTypeComplex,
        Content:      "项链宝石松动加固",
    }
    repairService.SubmitRepair(req2)
 
    // 测试3:重大维修
    req3 := &domain.RepairRequest{
        CustomerName: "王先生",
        RepairType:   domain.RepairTypeMajor,
        Content:      "钻戒主石更换+戒托重构",
    }
    repairService.SubmitRepair(req3)
 
    // 测试4:无法处理的请求
    req4 := &domain.RepairRequest{
        CustomerName: "陈女士",
        RepairType:   "古董珠宝修复",
        Content:      "百年翡翠手镯断裂拼接",
    }
    repairService.SubmitRepair(req4)
}

输出:

相关推荐
吴声子夜歌1 小时前
ApacheCommons——commons-pool2(高性能通用对象池框架)
java·开发语言·apache
kruptos6 小时前
分布式系统怎么“选主“?Raft 共识一次讲清
开发语言·分布式·php·共识算法
吴声子夜歌6 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
benchmark_cc7 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库7 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
Tairitsu_H7 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
泡海椒8 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
小智老师PMP8 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
花酒锄作田8 小时前
Go - Gin中使用sessions
golang
江畔柳前堤9 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native