go: Visitor Pattern

项目结构:

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())
}

输出:

相关推荐
宣宣猪的小花园.1 小时前
C语言重难点全解析:内存管理到位运算
c语言·开发语言·单片机
方安乐5 小时前
python之向量、向量和、向量点积
开发语言·python·numpy
会编程的土豆7 小时前
洛谷题单入门1 顺序结构
数据结构·算法·golang
小小小米粒7 小时前
Collection单列集合、Map(Key - Value)双列集合,多继承实现。
java·开发语言·windows
czhc11400756638 小时前
C# 428 线程、异步
开发语言·c#
:1218 小时前
java基础
java·开发语言
SilentSamsara9 小时前
Python 环境搭建完整指南:从下载安装到运行第一个程序
开发语言·python
小短腿的代码世界9 小时前
Qt文件系统与IO深度解析:从QFile到异步文件操作
开发语言·qt
harder32110 小时前
RMP模式的创新突破
开发语言·学习·ios·swift·策略模式