news 2026/7/2 1:25:39

go: Handshaking Pattern

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
go: Handshaking Pattern

项目结构:

展示了一个珠宝企业级系统中基于"握手模式"(Handshaking Pattern)的Go语言实现。系统通过JewelryWorkshop领域实体实现负载控制,当工坊达到最大负载(5个订单)时拒绝新订单。核心组件包括:

  1. 订单处理服务(OrderService)负责订单提交与完成
  2. 工坊(Workshop)通过Handshake()方法自检负载状态
  3. 材料管理、质检、财务等配套服务 调用示例演示了订单全生命周期处理: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")) }

输出:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 1:24:20

看见旋律 - WinUI3 实现音乐监听:47 种漂亮的数学线条形态

在 看见旋律 - WPF 实现音乐监听&#xff1a;频谱图展示-CSDN博客 中&#xff0c;我实现了对音乐旋律的监听&#xff0c;把监测到的鼓点、低频通量等可视化&#xff0c;看到了漂亮有趣的节奏线&#xff0c;现在我们把它与常见的数学线条结合&#xff0c;让节奏影响线条灯粗细、…

作者头像 李华
网站建设 2026/7/2 1:21:16

遗传算法实操调参与收敛性诊断实战指南

1. 项目概述&#xff1a;这不是又一篇“遗传算法入门”——而是你真正能动手跑通、调得动、改得明白的第二课“遗传算法入门”这个词&#xff0c;我见得太多。打开网页&#xff0c;十篇里八篇是复制粘贴的生物类比&#xff1a;染色体、基因、交叉、变异、适应度……讲得像高中生…

作者头像 李华
网站建设 2026/7/2 1:20:25

AI 辅助:后端架构选型取舍:没有银弹,只有约束条件

AI 辅助&#xff1a;后端架构选型取舍&#xff1a;没有银弹&#xff0c;只有约束条件 一、架构选型必须从约束出发 后端架构选型最怕脱离约束讨论。微服务、单体、Serverless、消息队列、缓存、分库分表、Kubernetes&#xff0c;每一种技术都有适用场景和代价。架构师要做的不是…

作者头像 李华