go: Futures & Promises Pattern

项目结构:

image

 

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Futures & Promises 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/6/23 20:47
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : logger.go
*/
package utils

import (
	"log"
	"os"
	"time"
)

type Logger struct {
	inner *log.Logger
}

func NewLogger(name string) *Logger {
	l := &Logger{
		inner: log.New(os.Stdout, "", 0),
	}
	return l
}

func (l *Logger) Info(msg string) {
	now := time.Now().Format("2006-01-02 15:04:05")
	l.inner.Printf("[%s] INFO %s\n", now, msg)
}





/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Futures & Promises 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/6/23 20:47
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : order_state.go
*/
package core

// 订单状态枚举
type OrderState string

const (
	StateCreated       OrderState = "已创建"
	StatePurchasing    OrderState = "采购中"
	StatePurchased     OrderState = "采购完成"
	StateDesigning     OrderState = "设计中"
	StateDesigned      OrderState = "设计完成"
	StateManufacturing OrderState = "加工中"
	StateManufactured  OrderState = "加工完成"
	StateQualityCheck  OrderState = "质检中"
	StateQualified     OrderState = "质检通过"
	StateStoring       OrderState = "入库中"
	StateCompleted     OrderState = "全部完成"
	StateFailed        OrderState = "执行失败"
)



/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Futures & Promises 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/6/23 20:48
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : base_task.go
*/
package core

// 任务抽象接口 Promise 契约
// ITask 所有工序任务统一接口(对应Python ITask Promise)
type ITask interface {
	Execute(args ...interface{}) (interface{}, error)
	GetName() string
}

  

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Futures & Promises 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/6/23 20:50
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : purchase_task.go
*/
package tasks

import (
	"godesginpattern/futurespromises/core"
	"godesginpattern/futurespromises/utils"
	"time"
)

// 采购任务
type PurchaseTask struct {
	logger *utils.Logger
}

func NewPurchaseTask() core.ITask {
	return &PurchaseTask{
		logger: utils.NewLogger("PurchaseTask"),
	}
}

func (p *PurchaseTask) Execute(args ...interface{}) (interface{}, error) {
	p.logger.Info("开始采购 1克拉 GIA 裸石...")
	time.Sleep(2 * time.Second)
	res := "1克拉GIA裸石"
	p.logger.Info("采购完成:" + res)
	return res, nil
}

func (p *PurchaseTask) GetName() string {
	return "采购任务"
}





/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Futures & Promises 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/6/23 20:50
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : design_task.go
*/
package tasks

import (
	"fmt"
	"godesginpattern/futurespromises/core"
	"godesginpattern/futurespromises/utils"
	"time"
)

// 设计任务
type DesignTask struct {
	logger *utils.Logger
}

func NewDesignTask() core.ITask {
	return &DesignTask{
		logger: utils.NewLogger("DesignTask"),
	}
}

func (d *DesignTask) Execute(args ...interface{}) (interface{}, error) {
	stone := args[0].(string)
	d.logger.Info(fmt.Sprintf("根据裸石【%s】开始3D设计...", stone))
	time.Sleep(1 * time.Second)
	res := "钻戒3D设计图纸"
	d.logger.Info("设计完成:" + res)
	return res, nil
}

func (d *DesignTask) GetName() string {
	return "设计任务"
}



/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Futures & Promises 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/6/23 20:51
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : manufacture_task.go
*/
package tasks

import (
	"fmt"
	"godesginpattern/futurespromises/core"
	"godesginpattern/futurespromises/utils"
	"time"
)

// 加工任务
type ManufactureTask struct {
	logger *utils.Logger
}

func NewManufactureTask() core.ITask {
	return &ManufactureTask{
		logger: utils.NewLogger("ManufactureTask"),
	}
}

func (m *ManufactureTask) Execute(args ...interface{}) (interface{}, error) {
	stone := args[0].(string)
	design := args[1].(string)
	m.logger.Info(fmt.Sprintf("加工:%s + %s", stone, design))
	time.Sleep(3 * time.Second)
	res := "1克拉定制钻戒成品"
	m.logger.Info("加工完成:" + res)
	return res, nil
}

func (m *ManufactureTask) GetName() string {
	return "加工任务"
}



/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Futures & Promises 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/6/23 20:52
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : quality_task.go
*/
package tasks

import (
	"fmt"
	"godesginpattern/futurespromises/core"
	"godesginpattern/futurespromises/utils"
	"time"
)

// 质检任务
type QualityCheckTask struct {
	logger *utils.Logger
}

func NewQualityCheckTask() core.ITask {
	return &QualityCheckTask{
		logger: utils.NewLogger("QualityTask"),
	}
}

func (q *QualityCheckTask) Execute(args ...interface{}) (interface{}, error) {
	product := args[0].(string)
	q.logger.Info(fmt.Sprintf("质检:%s", product))
	time.Sleep(1 * time.Second)
	q.logger.Info("质检通过")
	return product, nil
}

func (q *QualityCheckTask) GetName() string {
	return "质检任务"
}



/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Futures & Promises 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/6/23 20:52
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : storage_task.go
*/
package tasks

import (
	"fmt"
	"godesginpattern/futurespromises/core"
	"godesginpattern/futurespromises/utils"
	"time"
)

// 入库任务
type StorageTask struct {
	logger *utils.Logger
}

func NewStorageTask() core.ITask {
	return &StorageTask{
		logger: utils.NewLogger("StorageTask"),
	}
}

func (s *StorageTask) Execute(args ...interface{}) (interface{}, error) {
	product := args[0].(string)
	s.logger.Info(fmt.Sprintf("入库:%s", product))
	time.Sleep(1 * time.Second)
	res := fmt.Sprintf("可销售:%s", product)
	s.logger.Info("入库完成:" + res)
	return res, nil
}

func (s *StorageTask) GetName() string {
	return "入库任务"
}


/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Futures & Promises 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/6/23 20:53
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : process_service.go
*/
package service

import (
	"fmt"
	"godesginpattern/futurespromises/core"
	"godesginpattern/futurespromises/utils"
)

// 流程调度服务(核心 Future/Promise 链式执行)
type JewelryProcessService struct {
	logger *utils.Logger
	state  core.OrderState
}

func NewJewelryProcessService() *JewelryProcessService {
	svc := &JewelryProcessService{
		logger: utils.NewLogger("ProcessService"),
		state:  core.StateCreated,
	}
	svc.logger.Info(fmt.Sprintf("订单已创建 | 状态:%s", svc.state))
	return svc
}

func (s *JewelryProcessService) updateState(newState core.OrderState) {
	s.state = newState
	s.logger.Info(fmt.Sprintf("状态更新 → %s", newState))
}

// StartFullProcess 链式异步执行所有工序,模拟Future占位符流程
func (s *JewelryProcessService) StartFullProcess(
	purchase, design, manufacture, quality, storage core.ITask,
) (string, error) {
	// 1.采购
	s.updateState(core.StatePurchasing)
	stone, _ := purchase.Execute()
	s.updateState(core.StatePurchased)

	// 2.设计
	s.updateState(core.StateDesigning)
	designDoc, _ := design.Execute(stone)
	s.updateState(core.StateDesigned)

	// 3.加工
	s.updateState(core.StateManufacturing)
	product, _ := manufacture.Execute(stone, designDoc)
	s.updateState(core.StateManufactured)

	// 4.质检
	s.updateState(core.StateQualityCheck)
	qualified, _ := quality.Execute(product)
	s.updateState(core.StateQualified)

	// 5.入库
	s.updateState(core.StateStoring)
	finalRaw, _ := storage.Execute(qualified)
	s.updateState(core.StateCompleted)

	return finalRaw.(string), nil
}

 调用:

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Futures & Promises 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/6/23 20:54
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : futurespromisesbll.go
*/
package bll

import (
	"fmt"
	"godesginpattern/futurespromises/service"
	"godesginpattern/futurespromises/tasks"
	"time"
)

func demo() {
	// 实例化所有Promise任务
	purchase := tasks.NewPurchaseTask()
	design := tasks.NewDesignTask()
	manufacture := tasks.NewManufactureTask()
	quality := tasks.NewQualityCheckTask()
	storage := tasks.NewStorageTask()

	// 流程调度服务
	process := service.NewJewelryProcessService()

	// 启动全流程链式Future执行
	finalResult, err := process.StartFullProcess(purchase, design, manufacture, quality, storage)
	if err != nil {
		fmt.Println("流程执行失败:", err)
		return
	}

	// 等待5秒,保证最后日志完整输出,避免穿插输入框
	fmt.Println("\n⏳ 等待5秒,收集完整流程日志...")
	time.Sleep(5 * time.Second)

	fmt.Println("\n" + "============================================================")
	fmt.Printf("✅ 订单最终交付:%s\n", finalResult)
	fmt.Println("============================================================")
}

func FuturesPromisesMain() {
	demo()
}

  

输出:

image

 

 

 

posted @ 2026-06-23 21:04  ®Geovin Du Dream Park™  阅读(6)  评论(0)    收藏  举报