项目结构:

Go
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Visitor 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/23 20:16
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : jewelry.go
*/
package domain
// Jewel 珠宝接口
// 这里只定义 Accept,不引用任何 Visitor 接口
type Jewel interface {
Accept(v any)
}
// Diamond 钻石
type Diamond struct {
Carat float64
Clarity string
PricePerCarat float64
}
func (d *Diamond) Accept(v any) {
// 由 visitor 内部断言处理
}
// Gold 黄金
type Gold struct {
Weight float64
Purity string
PricePerGram float64
}
func (g *Gold) Accept(v any) {}
// Jade 翡翠
type Jade struct {
Color string
Texture string
BasePrice float64
}
func (j *Jade) Accept(v any) {}
Go
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Visitor 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/23 20:17
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : cleaner.go
*/
package visitor
import (
"fmt"
"godesginpattern/visitordesgin/domain"
)
// Cleaner 清洁师
type Cleaner struct{}
func NewCleaner() *Cleaner {
return &Cleaner{}
}
func (c *Cleaner) VisitDiamond(d *domain.Diamond) {
fmt.Println("[清洁] 钻石:超声波深度去污")
}
func (c *Cleaner) VisitGold(g *domain.Gold) {
fmt.Println("[清洁] 黄金:酸洗抛光提亮")
}
func (c *Cleaner) VisitJade(j *domain.Jade) {
fmt.Println("[清洁] 翡翠:软布+温水养护")
}
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Visitor 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/23 20:17
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : identifier.go
*/
package visitor
import (
"fmt"
"godesginpattern/visitordesgin/domain"
)
// Identifier 鉴定师
type Identifier struct{}
func NewIdentifier() *Identifier {
return &Identifier{}
}
func (i *Identifier) VisitDiamond(d *domain.Diamond) {
fmt.Printf("[鉴定] 钻石净度 %s -> 优质天然钻\n", d.Clarity)
}
func (i *Identifier) VisitGold(g *domain.Gold) {
fmt.Printf("[鉴定] 黄金纯度 %s -> 高纯度足金\n", g.Purity)
}
func (i *Identifier) VisitJade(j *domain.Jade) {
fmt.Printf("[鉴定] 翡翠 %s/%s -> 天然A货\n", j.Color, j.Texture)
}
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Visitor 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/23 20:17
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : iface.go
*/
package visitor
import "godesginpattern/visitordesgin/domain"
// Visitor 接口 放在 visitor 包内
// 单向依赖 domain,无循环
type Visitor interface {
VisitDiamond(d *domain.Diamond)
VisitGold(g *domain.Gold)
VisitJade(j *domain.Jade)
}
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Visitor 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/23 20:17
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : valuator.go
*/
package visitor
import (
"fmt"
"godesginpattern/visitordesgin/domain"
)
// Valuator 估值师
type Valuator struct{}
func NewValuator() *Valuator {
return &Valuator{}
}
// VisitDiamond 钻石估值
func (v *Valuator) VisitDiamond(d *domain.Diamond) {
total := d.Carat * d.PricePerCarat
fmt.Printf("[估值] 钻石 %.2f克拉 | 总价: %.2f\n", d.Carat, total)
}
// VisitGold 黄金估值
func (v *Valuator) VisitGold(g *domain.Gold) {
total := g.Weight * g.PricePerGram
fmt.Printf("[估值] 黄金 %.2fg | 总价: %.2f\n", g.Weight, total)
}
// VisitJade 翡翠估值
func (v *Valuator) VisitJade(j *domain.Jade) {
fmt.Printf("[估值] 翡翠 %s/%s | 评估价: %.2f\n", j.Color, j.Texture, j.BasePrice)
}
Go
/*
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Visitor 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/23 20:17
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : collection.go
*/
package structure
import (
"godesginpattern/visitordesgin/domain"
"godesginpattern/visitordesgin/visitor"
)
// JewelCollection 珠宝集合
type JewelCollection struct {
jewels []domain.Jewel
}
func NewJewelCollection() *JewelCollection {
return &JewelCollection{
jewels: make([]domain.Jewel, 0),
}
}
// Add 添加珠宝
func (c *JewelCollection) Add(j domain.Jewel) {
c.jewels = append(c.jewels, j)
}
// Accept 访问者处理所有珠宝
func (c *JewelCollection) Accept(v visitor.Visitor) {
for _, item := range c.jewels {
switch j := item.(type) {
case *domain.Diamond:
v.VisitDiamond(j)
case *domain.Gold:
v.VisitGold(j)
case *domain.Jade:
v.VisitJade(j)
}
}
}
调用:
Go
/*
# 版权所有 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/4/23 20:36
# User : geovindu
# Product : GoLand
# Project : godesginpattern
# File : visitorbll.go
*/
package bll
import (
"fmt"
"godesginpattern/visitordesgin/domain"
"godesginpattern/visitordesgin/structure"
"godesginpattern/visitordesgin/visitor"
)
func VisitorMain() {
// 1. 创建珠宝
diamond := &domain.Diamond{Carat: 1.5, Clarity: "VVS1", PricePerCarat: 80000}
gold := &domain.Gold{Weight: 20, Purity: "9999", PricePerGram: 600}
jade := &domain.Jade{Color: "帝王绿", Texture: "玻璃种", BasePrice: 180000}
// 2. 创建集合
coll := structure.NewJewelCollection()
coll.Add(diamond)
coll.Add(gold)
coll.Add(jade)
// 3. 执行访问者(统一用 fmt 保证输出顺序正确)
fmt.Println("=== 估值师 ===")
coll.Accept(visitor.NewValuator())
fmt.Println("\n=== 鉴定师 ===")
coll.Accept(visitor.NewIdentifier())
fmt.Println("\n=== 清洁师 ===")
coll.Accept(visitor.NewCleaner())
}
输出:
