go:Template Method Pattern

项目结构:

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Template Method 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/25 10:09
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : jewelry_template.go
*/
package template
 
import (
    "fmt"
    "godesginpattern/templatemethod/entity"
)
 
// 珠宝制作模板(算法骨架)
type JewelryTemplate struct {
    jewelry entity.Jewelry // 依赖接口,面向抽象编程
}
 
// NewJewelryTemplate 构造函数(企业级必须用构造函数)
func NewJewelryTemplate(j entity.Jewelry) *JewelryTemplate {
    return &JewelryTemplate{jewelry: j}
}
 
// Make 模板方法:对外暴露标准制作流程
func (t *JewelryTemplate) Make() {
    t.selectMaterial()               // 1. 选材(通用)
    fmt.Println(t.jewelry.Shaping()) // 2. 塑形(可变)
    t.polish()                       // 3. 打磨(通用)
    fmt.Println(t.jewelry.Inlay())   // 4. 镶嵌(可变)
    t.qualityCheck()                 // 5. 质检(通用)
    t.finish()                       // 6. 成品(通用)
}
 
// 以下为 通用步骤(私有方法,禁止外部调用)
func (t *JewelryTemplate) selectMaterial() {
    fmt.Println("[通用] 选材:甄选贵金属与天然宝石")
}
 
func (t *JewelryTemplate) polish() {
    fmt.Println("[通用] 打磨:镜面抛光处理")
}
 
func (t *JewelryTemplate) qualityCheck() {
    fmt.Println("[通用] 质检:符合国家珠宝生产标准")
}
 
func (t *JewelryTemplate) finish() {
    fmt.Println("[通用] 成品:防伪编码 + 礼盒包装\n")
}
Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Template Method 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/25 10:09
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : jewelry.go
*/
package entity
 
// 珠宝接口:仅约束可变步骤
type Jewelry interface {
    Shaping() string // 塑形
    Inlay() string   // 镶嵌
}
Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Template Method 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/25 10:09
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : ring.go
*/
package service
 
import "fmt"
 
// Ring 戒指:实现 entity.Jewelry 接口
type Ring struct{}
 
func NewRing() *Ring {
    return &Ring{}
}
 
func (r *Ring) Shaping() string {
    return fmt.Sprintf("[可变] 戒指塑形:标准戒圈成型")
}
 
func (r *Ring) Inlay() string {
    return fmt.Sprintf("[可变] 戒指镶嵌:单颗主石爪镶工艺")
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Template Method 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/25 10:10
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : necklace.go
*/
package service
 
import "fmt"
 
// Necklace 项链
type Necklace struct{}
 
func NewNecklace() *Necklace {
    return &Necklace{}
}
 
func (n *Necklace) Shaping() string {
    return fmt.Sprintf("[可变] 项链塑形:链条压制成型")
}
 
func (n *Necklace) Inlay() string {
    return fmt.Sprintf("[可变] 项链镶嵌:碎钻群镶点缀")
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Template Method 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/25 10:10
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : bracelet.go
*/
package service
 
import "fmt"
 
// Bracelet 手镯
type Bracelet struct{}
 
func NewBracelet() *Bracelet {
    return &Bracelet{}
}
 
func (b *Bracelet) Shaping() string {
    return fmt.Sprintf("[可变] 手镯塑形:宽版镯身压铸")
}
 
func (b *Bracelet) Inlay() string {
    return fmt.Sprintf("[可变] 手镯镶嵌:侧边排镶宝石")
}

调用:

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Template Method 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/25 10:13
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : templatemethodbll.go
templatemethod/
├── go.mod                  # 项目模块
├── internal/               # 内部包(外部不可访问)
│   ├── template/           # 模板层(算法骨架 + 通用步骤)
│   │   └── jewelry_template.go
│   ├── entity/             # 实体/接口层(定义约束)
│   │   └── jewelry.go
│   └── service/            # 业务实现层(可变步骤具体实现)
│       ├── ring.go
│       ├── necklace.go
│       └── bracelet.go
└── main.go                 # 入口调用层
*/
package bll
 
import (
    "fmt"
    "godesginpattern/templatemethod/service"
    "godesginpattern/templatemethod/template"
)
 
func TemplateMethodMain() {
    fmt.Println("=== 企业级珠宝制作系统 ===")
 
    // 制作戒指
    ring := service.NewRing()
    template.NewJewelryTemplate(ring).Make()
 
    // 制作项链
    necklace := service.NewNecklace()
    template.NewJewelryTemplate(necklace).Make()
 
    // 制作手镯
    bracelet := service.NewBracelet()
    template.NewJewelryTemplate(bracelet).Make()
}

输出:

相关推荐
张张123y2 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
wo_jack3 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
量化分析码农4 小时前
【Python量化波动率实战 02】波动率会传染:EWMA 指数加权给近期行情更大话语权
后端
冻柠檬飞冰走茶4 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
心若自由何处是束缚5 小时前
适配器模式:从原理到实战的完整指南
设计模式·适配器模式
FRing035 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊5 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
GISer_Jing5 小时前
如何学习Agent
后端·langchain
波力海苔夹心脆6756 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩6 小时前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常