Go的访问者模式

简介: 访问者模式是一种行为设计模式,它允许在不修改现有类的情况下向现有类层次结构中添加新操作。它通过引入一个独立的访问者对象,将算法与对象分离。

在访问者模式中,有三个关键组件:

  1. 访问者(Visitor):它是一个接口或抽象类,声明了对对象层次结构中每个类的访问方法。每个访问方法对应于可以在对象上执行的特定操作。
  2. 具体访问者(Concrete Visitor):它是实现了访问者接口的具体类,提供了对对象的具体操作。
  3. 元素(Element):它是对象层次结构中的类,定义了接受访问者的接口。
  4. 具体元素(Concrete Element):它是实现了元素接口的具体类,提供了接受访问者的具体实现。

访问者模式的核心思想是将算法的操作封装在访问者对象中,通过访问者对象来访问不同的元素对象。这样,当需要增加新的操作时,只需添加新的访问者对象,而无需修改现有的元素类。

以下是一个简单的使用Go语言实现的访问者模式示例,展示了对不同形状(圆形、矩形)进行面积计算的操作。在这个示例中,访问者接口 ShapeVisitor 声明了对不同形状的访问方法,具体访问者 AreaCalculator 实现了这些方法。元素接口 Shape 定义了接受访问者的方法,具体元素 Circle 和 Rectangle 实现了这个接口,并提供了具体的实现。


package main

import "fmt"

// ShapeVisitor 访问者接口
type ShapeVisitor interface {
    VisitCircle(circle *Circle)
    VisitRectangle(rectangle *Rectangle)
}

// AreaCalculator 具体访问者
type AreaCalculator struct {
}

func (a *AreaCalculator) VisitCircle(circle *Circle) {
    area := 3.14 * circle.radius * circle.radius
    fmt.Printf("圆形的面积为:%.2f\n", area)
}

func (a *AreaCalculator) VisitRectangle(rectangle *Rectangle) {
    area := rectangle.length * rectangle.width
    fmt.Printf("矩形的面积为:%.2f\n", area)
}

// Shape 元素接口
type Shape interface {
    Accept(visitor ShapeVisitor)
}

// Circle 具体元素
type Circle struct {
    radius float64
}

func (c *Circle) Accept(visitor ShapeVisitor) {
    visitor.VisitCircle(c)
}

// Rectangle 具体元素
type Rectangle struct {
    length float64
    width  float64
}

func (r *Rectangle) Accept(visitor ShapeVisitor) {
    visitor.VisitRectangle(r)
}

func main() {
    areaCalculator := &AreaCalculator{}

    circle := &Circle{radius: 5}
    circle.Accept(areaCalculator)

    rectangle := &Rectangle{length: 4, width: 6}
    rectangle.Accept(areaCalculator)
}
目录
相关文章
|
19天前
|
设计模式 Go
[设计模式 Go实现] 行为型~访问者模式
[设计模式 Go实现] 行为型~访问者模式
|
8月前
|
设计模式 Kubernetes 监控
Go编程模式 - 8-装饰、管道和访问者模式
装饰、管道和访问者模式的使用频率不高,但在特定场景下会显得很酷
22 0
|
11月前
|
设计模式 算法 编译器
Go语言实现设计模式之访问者模式
本文将详细介绍Go语言中的访问者模式的概念、用途和实现方法。访问者模式是一种行为型设计模式,它允许你将算法从对象结构中分离出来,从而使算法可以独立于对象而变化。我们将通过开发中的示例和生活中的场景来说明访问者模式的应用场景,并给出相应的代码示例和输出结果。
124 1
|
设计模式 存储 算法
Go设计模式(24)-访问者模式
访问者模式理解比较困难。可以认为对象开了一扇门,用来接收访问者,然后访问者便可在对象内部操作对象。简单来说,对象对访问者进行了授权。这样做能够实现对象和操作的解耦,职责更加单一。对象只管理自身,操作功能安置在访问者中。
|
3天前
|
Go 索引
Go 语言切片(Slice)
Go 语言切片(Slice)
9 1
|
3天前
|
存储 Go Python
Go 语言结构体
Go 语言结构体
6 0
|
3天前
|
存储 Go
Go 语言指针
Go 语言指针
7 0
|
3天前
|
JSON Java Go
使用go语言中的内置库调试性能
【5月更文挑战第21天】本文介绍Go 语言提供了内置的 expvar 模块来输出度量数据,帮助定位性能瓶颈。与 pprof 不同,expvar 专注于应用的宏观状态,通过 HTTP 接口 `/debug/vars` 提供标准的 JSON 格式数据,包括自定义度量和内存统计等。通过 expvar,开发者可以轻松监控应用状态,如消息处理速率、内存使用等,而无需像 C++ 或 Java 那样手动实现。
20 0
使用go语言中的内置库调试性能
|
4天前
|
编译器 Go 索引
Go 语言数组
Go 语言数组
9 1
|
4天前
|
Go CDN
Go 语言变量作用域
Go 语言变量作用域
14 4