go:Decorator Pattern

项目结构:

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Decorator 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/4/20 20:07
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : decorator.go
*/
package domain
 
// BaseDecorator 装饰器基类(组合模式:持有Jewelry接口)
// 所有增值装饰器都继承它,实现默认转发
type BaseDecorator struct {
    Jewelry Jewelry
}
 
// 默认转发:不修改原属性/流程,子类重写实现增强
func (d *BaseDecorator) GetAttribute() JewelryAttribute {
    return d.Jewelry.GetAttribute()
}
 
func (d *BaseDecorator) GetProcessList() []ProcessStep {
    return d.Jewelry.GetProcessList()
}
 
func (d *BaseDecorator) GetProductName() string {
    return d.Jewelry.GetProductName()
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Decorator 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/4/20 20:07
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : jewelry.go
*/
package domain
 
// JewelryAttribute 珠宝结构化属性(企业级强类型,禁止字符串拼接)
type JewelryAttribute struct {
    Material string `json:"material"` // 材质
    Craft    string `json:"craft"`    // 工艺
    Inlay    string `json:"inlay"`    // 镶嵌(增值)
    Cert     string `json:"cert"`     // 证书(增值)
    Pack     string `json:"pack"`     // 包装(增值)
}
 
// ProcessStep 加工流程步骤(结构化流程)
type ProcessStep struct {
    StepName string `json:"step_name"`
    Sequence int    `json:"sequence"` // 执行顺序
}
 
// Jewelry 珠宝标准接口(企业契约:固定不变,统一规范)
type Jewelry interface {
    // GetAttribute 获取完整珠宝属性(结构化)
    GetAttribute() JewelryAttribute
    // GetProcessList 获取完整流程链(结构化)
    GetProcessList() []ProcessStep
    // GetProductName 获取产品名称
    GetProductName() string
}
Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Decorator 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/4/20 20:07
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : basic_jewelry.go
*/
package service
 
import "godesginpattern/decorator/domain"
 
// BasicJewelry 基础珠宝实现(核心实体:材质+基础工艺+基础流程)
type BasicJewelry struct {
    attribute domain.JewelryAttribute
}
 
// NewBasicJewelry 创建基础珠宝(工厂模式)
func NewBasicJewelry(material, craft string) domain.Jewelry {
    return &BasicJewelry{
        attribute: domain.JewelryAttribute{
            Material: material,
            Craft:    craft,
        },
    }
}
 
// GetAttribute 实现接口:返回核心属性
func (b *BasicJewelry) GetAttribute() domain.JewelryAttribute {
    return b.attribute
}
 
// GetProcessList 实现接口:返回基础加工流程
func (b *BasicJewelry) GetProcessList() []domain.ProcessStep {
    return []domain.ProcessStep{
        {StepName: "原料检验", Sequence: 1},
        {StepName: "切割成型", Sequence: 2},
        {StepName: "基础抛光", Sequence: 3},
    }
}
 
// GetProductName 产品名称
func (b *BasicJewelry) GetProductName() string {
    return "基础珠宝"
}
Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Decorator 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/4/20 20:07
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : inlay.go
*/
package decorator
 
import "godesginpattern/decorator/domain"
 
// DiamondInlayDecorator 钻石镶嵌装饰器
type DiamondInlayDecorator struct {
    domain.BaseDecorator
}
 
func NewDiamondInlay(j domain.Jewelry) domain.Jewelry {
    return &DiamondInlayDecorator{
        BaseDecorator: domain.BaseDecorator{Jewelry: j},
    }
}
 
// 重写:扩展属性
func (d *DiamondInlayDecorator) GetAttribute() domain.JewelryAttribute {
    attr := d.Jewelry.GetAttribute()
    attr.Inlay = "天然钻石镶嵌"
    return attr
}
 
// 重写:扩展流程
func (d *DiamondInlayDecorator) GetProcessList() []domain.ProcessStep {
    list := d.Jewelry.GetProcessList()
    nextSeq := len(list) + 1
    return append(list,
        domain.ProcessStep{StepName: "钻石镶嵌", Sequence: nextSeq},
        domain.ProcessStep{StepName: "镶嵌精度质检", Sequence: nextSeq + 1},
    )
}
 
func (d *DiamondInlayDecorator) GetProductName() string {
    return d.Jewelry.GetProductName() + " + 钻石镶嵌款"
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Decorator 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/4/20 20:08
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : certificate.go
*/
package decorator
 
import "godesginpattern/decorator/domain"
 
// GIACertificateDecorator GIA证书装饰器
type GIACertificateDecorator struct {
    domain.BaseDecorator
}
 
func NewGIACertificate(j domain.Jewelry) domain.Jewelry {
    return &GIACertificateDecorator{
        BaseDecorator: domain.BaseDecorator{Jewelry: j},
    }
}
 
func (g *GIACertificateDecorator) GetAttribute() domain.JewelryAttribute {
    attr := g.Jewelry.GetAttribute()
    attr.Cert = "GIA国际权威证书"
    return attr
}
 
func (g *GIACertificateDecorator) GetProcessList() []domain.ProcessStep {
    list := g.Jewelry.GetProcessList()
    nextSeq := len(list) + 1
    return append(list,
        domain.ProcessStep{StepName: "权威鉴定", Sequence: nextSeq},
        domain.ProcessStep{StepName: "证书出具", Sequence: nextSeq + 1},
    )
}
 
func (g *GIACertificateDecorator) GetProductName() string {
    return g.Jewelry.GetProductName() + " + 带GIA证书"
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Decorator 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/4/20 20:08
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : package.go
*/
package decorator
 
import "godesginpattern/decorator/domain"
 
// LuxuryPackDecorator 高端包装装饰器
type LuxuryPackDecorator struct {
    domain.BaseDecorator
}
 
func NewLuxuryPack(j domain.Jewelry) domain.Jewelry {
    return &LuxuryPackDecorator{
        BaseDecorator: domain.BaseDecorator{Jewelry: j},
    }
}
 
func (l *LuxuryPackDecorator) GetAttribute() domain.JewelryAttribute {
    attr := l.Jewelry.GetAttribute()
    attr.Pack = "高端红木礼盒+防伪包装"
    return attr
}
 
func (l *LuxuryPackDecorator) GetProcessList() []domain.ProcessStep {
    list := l.Jewelry.GetProcessList()
    nextSeq := len(list) + 1
    return append(list,
        domain.ProcessStep{StepName: "精包装", Sequence: nextSeq},
        domain.ProcessStep{StepName: "成品终检", Sequence: nextSeq + 1},
    )
}
 
func (l *LuxuryPackDecorator) GetProductName() string {
    return l.Jewelry.GetProductName() + " + 高端礼盒"
}

调用:

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Decorator 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/4/20 20:12
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : decoratorbll.go
Decorator
├── domain/         领域层:核心实体、接口、常量(业务本源)
│   ├── jewelry.go  珠宝实体、属性结构、流程结构
│   └── decorator.go 装饰器接口定义
├── service/        服务层:基础服务实现
│   └── basic_jewelry.go
├── decorator/      装饰器层:增值扩展实现(属性+流程)
│   ├── inlay.go
│   ├── certificate.go
│   └── package.go
└── main.go         入口层:业务编排
*/
package bll
 
import (
    "encoding/json"
    "fmt"
    "godesginpattern/decorator/decorator"
    "godesginpattern/decorator/service"
)
 
func DecoratorMain() {
    // 1. 创建基础珠宝
    base := service.NewBasicJewelry("18K金", "5A级镜面抛光")
 
    // 2. 链式装饰(企业级灵活编排:顺序随意、可插拔)
    final := decorator.NewLuxuryPack(
        decorator.NewGIACertificate(
            decorator.NewDiamondInlay(base),
        ),
    )
 
    // 3. 输出结构化结果(可直接用于API/数据库/日志)
    fmt.Println("=== 最终珠宝产品 ===")
    fmt.Println("产品名称:", final.GetProductName())
 
    attr, _ := json.MarshalIndent(final.GetAttribute(), "", "  ")
    fmt.Println("\n=== 珠宝属性(结构化)===")
    fmt.Println(string(attr))
 
    proc, _ := json.MarshalIndent(final.GetProcessList(), "", "  ")
    fmt.Println("\n=== 全流程链路(结构化)===")
    fmt.Println(string(proc))
}

输出:

相关推荐
ximu_polaris2 小时前
设计模式(C++)-行为型模式-观察者模式
c++·观察者模式·设计模式
故事和你913 小时前
洛谷-算法2-1-前缀和、差分与离散化1
开发语言·数据结构·c++·算法·深度优先·动态规划·图论
励志的小陈9 小时前
贪吃蛇(C语言实现,API)
c语言·开发语言
Makoto_Kimur9 小时前
java开发面试-AI Coding速成
java·开发语言
laowangpython9 小时前
Gurobi求解器Matlab安装配置教程
开发语言·其他·matlab
wengqidaifeng9 小时前
python启航:1.基础语法知识
开发语言·python
观北海9 小时前
Windows 平台 Python 极简 ORB-SLAM3 Demo,从零实现实时视觉定位
开发语言·python·动态规划
Ulyanov11 小时前
《PySide6 GUI开发指南:QML核心与实践》 第二篇:QML语法精要——构建声明式UI的基础
java·开发语言·javascript·python·ui·gui·雷达电子对抗系统仿真
码界筑梦坊11 小时前
357-基于Java的大型商场应急预案管理系统
java·开发语言·毕业设计·知识分享