go: Handshaking Pattern
项目结构:
展示了一个珠宝企业级系统中基于"握手模式"(Handshaking Pattern)的Go语言实现。系统通过JewelryWorkshop领域实体实现负载控制,当工坊达到最大负载(5个订单)时拒绝新订单。核心组件包括:
- 订单处理服务(OrderService)负责订单提交与完成
- 工坊(Workshop)通过Handshake()方法自检负载状态
- 材料管理、质检、财务等配套服务 调用示例演示了订单全生命周期处理:7个订单中前5个被接受,后2个因过载被拒;完成2个订单后,被拒订单可重新提交。系统采用分层架构,各模块职责明确,通过握手机制确保系统稳定性。
/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Handshaking 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/7/1 21:31 # User : geovindu # Product : GoLand # Project : godesginpattern # File : config.go */ package config const ( WorkshopMaxLoad = 5 // 握手模式最大负载 ) /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Handshaking 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/7/1 21:38 # User : geovindu # Product : GoLand # Project : godesginpattern # File : jewelry_enums.go */ package enums type JewelryType string type OrderStatus string const ( DIAMOND_RING JewelryType = "钻戒" GOLD_BRACELET JewelryType = "黄金手镯" JADE_PENDANT JewelryType = "翡翠吊坠" RUBY_NECKLACE JewelryType = "红宝石项链" PLATINUM_RING JewelryType = "铂金戒指" SAPPHIRE_EARRING JewelryType = "蓝宝石耳环" PEARL_NECKLACE JewelryType = "珍珠项链" ) const ( PRODUCING OrderStatus = "生产中" COMPLETED OrderStatus = "已完成" REJECTED OrderStatus = "已拒绝" QC_PASS OrderStatus = "质检通过" SETTLED OrderStatus = "已结算" ) /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Handshaking 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/7/1 21:32 # User : geovindu # Product : GoLand # Project : godesginpattern # File : exceptions.go */ package exceptions import "errors" var ( WorkshopOverload = errors.New("工坊已满负荷") OrderNotFound = errors.New("订单不存在") ) /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Handshaking 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/7/1 21:32 # User : geovindu # Product : GoLand # Project : godesginpattern # File : workshop.go */ package domain import ( "godesginpattern/handshaking/exceptions" ) // JewelryWorkshop 珠宝工坊领域实体 type JewelryWorkshop struct { MaxLoad int CurrentOrders []string } // NewWorkshop 构造函数:负载阈值由上层服务传入,domain 不依赖 config func NewWorkshop(maxLoad int) *JewelryWorkshop { return &JewelryWorkshop{ MaxLoad: maxLoad, CurrentOrders: []string{}, } } // Handshake 握手模式核心校验:组件自检负载,过载返回不可接单 func (w *JewelryWorkshop) Handshake() bool { return len(w.CurrentOrders) < w.MaxLoad } // AcceptOrder 承接加工单,握手失败返回过载异常 func (w *JewelryWorkshop) AcceptOrder(orderID string) error { if !w.Handshake() { return exceptions.WorkshopOverload } w.CurrentOrders = append(w.CurrentOrders, orderID) return nil } // CompleteOrder 完成加工释放工位负载 func (w *JewelryWorkshop) CompleteOrder(orderID string) error { for i, id := range w.CurrentOrders { if id == orderID { w.CurrentOrders = append(w.CurrentOrders[:i], w.CurrentOrders[i+1:]...) return nil } } return exceptions.OrderNotFound } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Handshaking 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/7/1 21:36 # User : geovindu # Product : GoLand # Project : godesginpattern # File : order_repo.go */ package repository import ( "godesginpattern/handshaking/enums" ) type Order struct { OrderID string JewelryType enums.JewelryType Customer string Status enums.OrderStatus } var OrderDB = map[string]Order{} func SaveOrder(o Order) { OrderDB[o.OrderID] = o } func GetOrder(id string) (Order, bool) { o, ok := OrderDB[id] return o, ok } func UpdateStatus(id string, status enums.OrderStatus) { o := OrderDB[id] o.Status = status OrderDB[id] = o } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Handshaking 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/7/1 21:39 # User : geovindu # Product : GoLand # Project : godesginpattern # File : order_service.go */ package service import ( "godesginpattern/handshaking/domain" "godesginpattern/handshaking/enums" "godesginpattern/handshaking/repository" ) type OrderService struct { Workshop *domain.JewelryWorkshop } func (s *OrderService) SubmitOrder(orderID string, jt enums.JewelryType, customer string) string { err := s.Workshop.AcceptOrder(orderID) if err != nil { return "❌ 订单" + orderID + " 被拒绝:" + err.Error() } repository.SaveOrder(repository.Order{ OrderID: orderID, JewelryType: jt, Customer: customer, Status: enums.PRODUCING, }) return "✅ 订单" + orderID + " 已接受" } func (s *OrderService) CompleteOrder(orderID string) string { err := s.Workshop.CompleteOrder(orderID) if err != nil { return "⚠️ " + err.Error() } repository.UpdateStatus(orderID, enums.COMPLETED) return "🏆 订单" + orderID + " 加工完成" } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Handshaking 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/7/1 21:40 # User : geovindu # Product : GoLand # Project : godesginpattern # File : material_service.go */ package service type MaterialService struct{} func (m *MaterialService) UseMaterial(orderID string, material string) string { return "📦 订单" + orderID + " 使用原料:" + material } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Handshaking 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/7/1 21:41 # User : geovindu # Product : GoLand # Project : godesginpattern # File : workshop_api.go */ package api import ( "godesginpattern/handshaking/config" "godesginpattern/handshaking/domain" "godesginpattern/handshaking/enums" "godesginpattern/handshaking/service" ) type WorkshopAPI struct { OrderSvc *service.OrderService MaterialSvc *service.MaterialService QCSvc *service.QCService Finance *service.FinanceService } func NewAPI() *WorkshopAPI { // 配置仅在应用入口传入,domain 无感知 workshop := domain.NewWorkshop(config.WorkshopMaxLoad) return &WorkshopAPI{ OrderSvc: &service.OrderService{Workshop: workshop}, MaterialSvc: &service.MaterialService{}, QCSvc: &service.QCService{}, Finance: &service.FinanceService{}, } } func (api *WorkshopAPI) SubmitOrder(orderID string, jt enums.JewelryType, customer string) string { return api.OrderSvc.SubmitOrder(orderID, jt, customer) } func (api *WorkshopAPI) CompleteOrder(orderID string) string { return api.OrderSvc.CompleteOrder(orderID) } func (api *WorkshopAPI) UseMaterial(orderID string, material string) string { return api.MaterialSvc.UseMaterial(orderID, material) } func (api *WorkshopAPI) QC(orderID string) string { return api.QCSvc.Pass(orderID) } func (api *WorkshopAPI) Settle(orderID string) string { return api.Finance.Settle(orderID) }调用:
/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述: # 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/7/1 21:43 # User : geovindu # Product : GoLand # Project : godesginpattern # File : handshakingbll.go */ package bll import ( "godesginpattern/handshaking/api" "godesginpattern/handshaking/enums" ) func HandshakingMain() { println("===== 珠宝企业级系统启动(握手模式)=====\n") api := api.NewAPI() orders := []struct { orderID string jt enums.JewelryType customer string }{ {"ORD001", enums.DIAMOND_RING, "张先生"}, {"ORD002", enums.GOLD_BRACELET, "李女士"}, {"ORD003", enums.JADE_PENDANT, "王小姐"}, {"ORD004", enums.RUBY_NECKLACE, "刘先生"}, {"ORD005", enums.PLATINUM_RING, "陈女士"}, {"ORD006", enums.SAPPHIRE_EARRING, "赵先生"}, {"ORD007", enums.PEARL_NECKLACE, "孙女士"}, } println("----- 接收客户订单 -----") for _, o := range orders { println(api.SubmitOrder(o.orderID, o.jt, o.customer)) } println("\n----- 完成2个订单 -----") println(api.CompleteOrder("ORD001")) println(api.CompleteOrder("ORD002")) println("\n----- 重新接收被拒订单 -----") println(api.SubmitOrder("ORD006", enums.SAPPHIRE_EARRING, "赵先生")) println(api.SubmitOrder("ORD007", enums.PEARL_NECKLACE, "孙女士")) println("\n----- 原料使用 -----") println(api.UseMaterial("ORD001", "18K黄金 + 钻石")) println("\n----- 质检 -----") println(api.QC("ORD001")) println("\n----- 财务结算 -----") println(api.Settle("ORD001")) }输出:
