当前位置: 首页 > news >正文

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")) }

输出:

http://www.cnnetsun.cn/news/3093131.html

相关文章:

  • 看见旋律 - WinUI3 实现音乐监听:47 种漂亮的数学线条形态
  • 实战指南:如何用changedetection.io构建企业级网站变更监控系统
  • 遗传算法实操调参与收敛性诊断实战指南
  • AI 辅助:后端架构选型取舍:没有银弹,只有约束条件
  • 系统调用全路径拆解:从用户态 read(fd) 到内核驱动的上下文切换代价与字符设备实战
  • 3D渲染新范式:从画面像素到全域实景空间 像素流实时建模 新一代视频孪生图形架构
  • AI 辅助:Service Mesh 落地经验:流量治理不是先把边车塞满
  • GitOps 发布实践:声明式配置也需要回滚纪律
  • AI浪潮下普通人焦虑何解?花叔、“五道口纳什”等UP主分享学习路径
  • 企业级检索增强 后端集成:Java 服务如何管理知识库版本
  • PPTist:8个专业模板+完整功能,打造浏览器中的PowerPoint替代方案
  • 工程化工程师的炼丹日常:深夜调参也要守住边界
  • 中餐厅摆台-点击下一步一次显示骨碟碗勺并显示文字 距离
  • STM32寄存器开发练习(一):GPIO-从最原始的代码到规范写法
  • 从推荐系统到大模型:算法工程师的转型实战指南
  • 机械设计公差与配合实战指南:从核心原理到图纸标注
  • 零代码设计小米穿戴表盘:Mi-Create让创意触手可及
  • 为什么说APAxpo已然成为各大品牌新品首发的核心阵地?
  • Redis Bitmap 实现北极星日淘用户签到与活跃度统计(极致省内存)
  • 2026大二寸证件照制作工具指南:手机App、免费无水印小程序操作教程
  • Topit:告别窗口切换烦恼,让你的Mac窗口永远在最前面
  • 机电安装公司有哪些?广州机电安装公司推荐!
  • IDEA大纲导航突然卡顿?,紧急排查清单:内存泄漏、插件冲突、AST缓存溢出——3分钟定位根因的5个诊断命令
  • Claude 3.5语义压缩层解析:零偏移输出与灰度信息蒸发
  • GPT-4o深度解析:技术落地与工程避坑指南
  • 三通道直流电阻测试仪的现场效率对比
  • 如何在Blender中高效创作GTA V模型:Sollumz插件实战指南
  • Playwright元素定位实战:从原理到健壮策略的完整指南
  • STM32驱动WS2812全彩LED:SPI+DMA高效实现动态光效
  • Anthropic Mythos:语义约束引擎驱动的推理阶跃