访问者模式通过接口和组合在Go中实现,将数据结构与操作分离,适用于文件系统遍历等需对稳定结构执行多操作的场景。
访问者模式是一种行为设计模式,它允许你在不修改对象结构的情况下定义新的操作。在 Go 语言中,虽然没有继承和重载支持,但通过接口和组合可以很好地实现访问者模式。
将数据结构与作用于其上的操作分离,使得可以在不改变结构的前提下添加新操作。这特别适用于需要对一组复杂对象结构执行多种不同操作的场景。
主要角色包括:
由于 Go 不支持方法重载,我们不能像 Java 那样为不同类型的元素定义同名但参数不同的 Visit 方法。解决方案是使用接口和类型断言,或通过统一的访问者接口配合类型判断。
示例:文件系统遍历
package main
import "fmt"
// Visitor 定义访问者接口
type Visitor interface {
VisitFile(*File)
VisitDirectory(*Directory)
}
// Element 定义可访问元素接口
type Element interface {
Accept(Visitor)
}
// File 文件类
type File struct {
Name string
Size int
}
func (f *File) Accept(v Visitor) {
v.VisitFile(f)
}
// Directory 目录类
type Directory struct {
Name string
Children []Element
}
func (d *Directory) Accept(v Visitor) {
v.VisitDirectory(d)
for _, child := range d.Children {
child.Accept(v)
}
}
// PrintVisitor 打印访问者
type PrintVisitor struct{}
func (v *PrintVisitor) VisitFile(f *File) {
fmt.Printf("文件: %s (%d字节)\n", f.Name, f.Size)
}
func (v *PrintVisitor) VisitDirectory(d *Directory) {
fmt.Printf("目录: %s\n", d.Name)
}
// SizeVisitor 统计大小访问者
type SizeVisitor struct {
TotalSize int
}
func (v *SizeVisitor) VisitFile(f *File) {
v.TotalSize += f.Size
}
func (v *SizeVisitor) VisitDirectory(d *Directory) {
// 目录本身不计入大小
}
func (v *SizeVisitor) GetTotal() int {
return v.TotalSize
}构建一个简单的文件树并应用不同的访问者:
func main() {
root := &Directory{
Name: "根目录",
Children: []Element{
&File{Name: "readme.txt", Size: 1024},
&Directory{
Name: "子目录",
Children: []Element{
&File{Name: "main.go", Size: 2048},
&File{Name: "config.json", Size: 512},
},
},
},
}
// 使用打印访问者
fmt.Println("=== 打印文件结构 ===")
printer := &PrintVisitor{}
root.Accept(printer)
// 使用统计访问者
fmt.Println("\n=== 计算总大小 ===")
sizeVisitor := &SizeVisitor{}
root.Accept(sizeVisitor)
fmt.Printf("总大小: %d 字节\n
", sizeVisitor.GetTotal())
}Go 的访问者模式实现依赖接口和多态,关键在于合理设计 Element 和 Visitor 接口。
基本上就这些。Go 虽然语法简洁,但通过接口依然能优雅实现经典设计模式。访问者模式帮助你解耦数据与行为,让代码更具扩展性。
# java
# js
# json
# go
# golang
# 字节
# ai
相关文章:
如何零基础在云服务器搭建WordPress站点?
平台云上自主建站:模板化设计与智能工具打造高效网站
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
制作表格网站有哪些,线上表格怎么弄?
Android自定义控件实现温度旋转按钮效果
制作电商网页,电商供应链怎么做?
中山网站制作网页,中山新生登记系统登记流程?
广德云建站网站建设方案与建站流程优化指南
,柠檬视频怎样兑换vip?
如何快速配置高效服务器建站软件?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
手机网站制作与建设方案,手机网站如何建设?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
网站企业制作流程,用什么语言做企业网站比较好?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
家庭建站与云服务器建站,如何选择更优?
如何正确选择百度移动适配建站域名?
如何用PHP工具快速搭建高效网站?
如何选择适配移动端的WAP自助建站平台?
免费网站制作appp,免费制作app哪个平台好?
如何在Windows环境下新建FTP站点并设置权限?
如何在服务器上配置二级域名建站?
太平洋网站制作公司,网络用语太平洋是什么意思?
如何通过二级域名建站提升品牌影响力?
如何将凡科建站内容保存为本地文件?
Python多线程使用规范_线程安全解析【教程】
如何在Ubuntu系统下快速搭建WordPress个人网站?
如何在Golang中使用replace替换模块_指定本地或远程路径
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
非常酷的网站设计制作软件,酷培ai教育官方网站?
网站制作公司排行榜,抖音怎样做个人官方网站
如何在万网ECS上快速搭建专属网站?
建站之星安装后界面空白如何解决?
北京专业网站制作设计师招聘,北京白云观官方网站?
C#如何序列化对象为XML XmlSerializer用法
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
如何在VPS电脑上快速搭建网站?
如何通过免费商城建站系统源码自定义网站主题与功能?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
魔方云NAT建站如何实现端口转发?
威客平台建站流程解析:高效搭建教程与设计优化方案
制作宣传网站的软件,小红书可以宣传网站吗?
定制建站哪家更专业可靠?推荐榜单揭晓
如何基于PHP生成高效IDC网络公司建站源码?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何用狗爹虚拟主机快速搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。