go: Handshaking Pattern

项目结构:

57f7774b-b662-4acc-9781-26af17a9b5d8

/*
# 版权所有  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"))
}

  

输出:

937d9bd85b02e522173a394ec6d2f044

 

posted @ 2026-07-01 22:48  ®Geovin Du Dream Park™  阅读(3)  评论(0)    收藏  举报