go: Chain of Responsibility Pattern
项目结构/* # 版权所有 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 // 维修详情 }/* # 版权所有 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) }/* # 版权所有 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() }调用/* # 版权所有 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) }输出