0

0

如何用Golang实现访问者模式_Golang 访问者模式实践

P粉602998670

P粉602998670

发布时间:2025-11-27 15:12:07

|

930人浏览过

|

来源于php中文网

原创

访问者模式通过接口和组合在Go中实现,将数据结构与操作分离,适用于文件系统遍历等需对稳定结构执行多操作的场景。

如何用golang实现访问者模式_golang 访问者模式实践

访问者模式是一种行为设计模式,它允许你在不修改对象结构的情况下定义新的操作。在 Go 语言中,虽然没有继承和重载支持,但通过接口和组合可以很好地实现访问者模式。

访问者模式的核心思想

将数据结构与作用于其上的操作分离,使得可以在不改变结构的前提下添加新操作。这特别适用于需要对一组复杂对象结构执行多种不同操作的场景。

主要角色包括:

  • 元素(Element):定义一个 Accept 方法,接收一个访问者对象
  • 访问者(Visitor):定义一系列 Visit 方法,对应不同的元素类型
  • 具体元素(ConcreteElement):实现 Accept 方法,调用访问者的 Visit 方法
  • 具体访问者(ConcreteVisitor):实现访问者的接口,完成具体逻辑

Go 中的实现方式

由于 Go 不支持方法重载,我们不能像 Java 那样为不同类型的元素定义同名但参数不同的 Visit 方法。解决方案是使用接口和类型断言,或通过统一的访问者接口配合类型判断。

立即学习go语言免费学习笔记(深入)”;

我要服装批发网
我要服装批发网

由逍遥网店系统修改而成,修改内容如下:前台商品可以看大图功能后台商品在线添加编辑功能 (允许UBB)破解了访问统计系统增加整合了更加强大的第三方统计系统 (IT学习者v1.6)并且更新了10月份的IP数据库。修正了后台会员订单折扣金额处理错误BUG去掉了会员折扣价这个功能,使用市场价,批发价。这样符合实际的模式,批发价非会员不可看修正了在线编辑无法使用 “代码&rdqu

下载

示例:文件系统遍历

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 接口。

  • 当新增元素类型时,所有现有访问者都需要更新接口实现
  • 适合数据结构相对稳定,但操作频繁变化的场景
  • 常见应用场景包括:语法树分析、对象序列化、UI 渲染等
  • 避免过度设计,简单场景直接用函数更清晰

基本上就这些。Go 虽然语法简洁,但通过接口依然能优雅实现经典设计模式。访问者模式帮助你解耦数据与行为,让代码更具扩展性。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

832

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

738

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

734

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

3

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.6万人学习

C# 教程
C# 教程

共94课时 | 6.8万人学习

Java 教程
Java 教程

共578课时 | 46.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号