news 2026/4/30 0:00:04

go: Visitor Pattern

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
go: Visitor Pattern

项目结构:

/* # 版权所有 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) {}
/* # 版权所有 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) }
/* # 版权所有 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) } } }

调用:

/* # 版权所有 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()) }

输出:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 23:55:03

保姆级教程:用EMQX和MQTT.fx手把手搭建你的第一个物联网通信测试环境

从零搭建物联网通信测试环境:EMQX与MQTT.fx实战指南 物联网技术的核心在于设备间的可靠通信,而MQTT协议凭借其轻量级和高效性成为物联网领域的首选方案。本文将带您完成从软件安装到完整通信测试的全流程,无需任何前置知识,只需跟…

作者头像 李华
网站建设 2026/4/29 23:50:22

设计成本暴降90%?GPT-image-2实测:如何降低创作成本

摘要GPT-image-2的发布视觉素材制作正式进入近零边缘国际成本时代。从位置摄影模拟到本土化商业营销图生成,其87%的摄影说服力正在对传统供应链产生巨大冲击。结合电商、外贸和UI设计行业的实测数据,本文将探讨企业如何借助API聚合平台实现设计的成本重构…

作者头像 李华
网站建设 2026/4/29 23:46:47

XSS 跨站脚本攻击解析-漏洞解析3

一、前言 跨站脚本攻击(XSS,Cross-Site Scripting)是OWASP TOP10 高频高危漏洞,属于典型的代码注入类攻击。 核心成因是Web 应用未对用户输入做严格校验、转义与过滤,导致恶意脚本被嵌入页面并在受害者浏览器中执行。…

作者头像 李华