[go] 访问者模式

简介: [go] 访问者模式

访问者模式


访问者模式是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。


模型说明


  1. 访问者(Visitor)接口声明了一系列以对象结构的具体元素为参数的访问者方法。如果编程语言支持重载,这些方法的名称可以是相同的,但是其参数一定是不同的。
  2. 具体访问者(Concrete Visitor)会为不同的具体元素类实现相同行为的几个不同版本。
  3. 元素(Element)接口声明了一个方法来“接收”访问者。该方法必须有一个参数被声明为访问者接口类型。
  4. 具体元素(Concrete Element)必须实现接收方法。该方法的目的是根据当前元素类将其调用重定向到相应访问者的方法。请注意,即使元素基类实现了该方法,所有子类都必须对其进行重写并调用访问者对象中的合适方法。
  5. 客户端(Client)通常会作为集合或其他复杂对象(例如一个**组合**树)的代表。客户端通常不知晓所有的具体元素类,因为它们会通过抽象接口与集合中的对象进行交互。


优缺点


1.优点


  • *开闭原则:*你可以引入在不同类对象上执行的新行为,且无需对这些类做出修改。
  • *单一职责原则:*可将同一行为的不同版本移到同一个类中。
  • 访问者对象可以在与各种对象交互时收集一些有用的信息。当你想要遍历一些复杂的对象结构(例如对象树),并在结构中的每个对象上应用访问者时,这些信息可能会有所帮助。


2.缺点


  • 每次在元素层次结构中添加或移除一个类时,你都要更新所有的访问者。
  • 在访问者同某个元素进行交互时,它们可能没有访问元素私有成员变量和方法的必要权限。


使用场景


  • 如果你需要对一个复杂对象结构(例如对象树)中的所有元素执行某些操作,可使用访问者模式。
  • 可使用访问者模式来清理辅助行为的业务逻辑。
  • 当某个行为仅在类层次结构中的一些类中有意义,而在其他类中没有意义时,可使用该模式。


参考代码


shape.go: 元件


package main
type Shape interface {
  getType() string
  accept(Visitor)
}


square.go: 具体元件


package main
type Square struct {
    side int
}
func (s *Square) accept(v Visitor) {
    v.visitForSquare(s)
}
func (s *Square) getType() string {
    return "Square"
}


circle.go: 具体元件


package main
type Circle struct {
    radius int
}
func (c *Circle) accept(v Visitor) {
    v.visitForCircle(c)
}
func (c *Circle) getType() string {
    return "Circle"
}


rectangle.go: 具体元件


package main
type Rectangle struct {
    l int
    b int
}
func (t *Rectangle) accept(v Visitor) {
    v.visitForrectangle(t)
}
func (t *Rectangle) getType() string {
    return "rectangle"
}


visitor.go: 访问者


package main
type Visitor interface {
    visitForSquare(*Square)
    visitForCircle(*Circle)
    visitForRectangle(*Rectangle)
}


areaCalculator.go: 具体访问者


package main
import (
    "fmt"
)
type AreaCalculator struct {
    area int
}
func (a *AreaCalculator) visitForSquare(s *Square) {
    // Calculate area for square.
    // Then assign in to the area instance variable.
    fmt.Println("Calculating area for square")
}
func (a *AreaCalculator) visitForCircle(s *Circle) {
    fmt.Println("Calculating area for circle")
}
func (a *AreaCalculator) visitForRectangle(s *Rectangle) {
    fmt.Println("Calculating area for rectangle")
}


middleCoordinates.go: 具体访问者


package main
import "fmt"
type MiddleCoordinates struct {
    x int
    y int
}
func (a *MiddleCoordinates) visitForSquare(s *Square) {
    // Calculate middle point coordinates for square.
    // Then assign in to the x and y instance variable.
    fmt.Println("Calculating middle point coordinates for square")
}
func (a *MiddleCoordinates) visitForCircle(c *Circle) {
    fmt.Println("Calculating middle point coordinates for circle")
}
func (a *MiddleCoordinates) visitForRectangle(t *Rectangle) {
    fmt.Println("Calculating middle point coordinates for rectangle")
}


main.go: 客户端代码


package main
import "fmt"
func main() {
    square := &Square{side: 2}
    circle := &Circle{radius: 3}
    rectangle := &Rectangle{l: 2, b: 3}
    areaCalculator := &AreaCalculator{}
    square.accept(areaCalculator)
    circle.accept(areaCalculator)
    rectangle.accept(areaCalculator)
    fmt.Println()
    middleCoordinates := &MiddleCoordinates{}
    square.accept(middleCoordinates)
    circle.accept(middleCoordinates)
    rectangle.accept(middleCoordinates)
}


output:


Calculating area for square
Calculating area for circle
Calculating area for rectangle
Calculating middle point coordinates for square
Calculating middle point coordinates for circle
Calculating middle point coordinates for rectangle
目录
打赏
0
0
0
0
75
分享
相关文章
[设计模式 Go实现] 行为型~访问者模式
[设计模式 Go实现] 行为型~访问者模式
Go编程模式 - 8-装饰、管道和访问者模式
装饰、管道和访问者模式的使用频率不高,但在特定场景下会显得很酷
51 0
Go的访问者模式
访问者模式是一种行为设计模式,它允许在不修改现有类的情况下向现有类层次结构中添加新操作。它通过引入一个独立的访问者对象,将算法与对象分离。
59 0
Go语言实现设计模式之访问者模式
本文将详细介绍Go语言中的访问者模式的概念、用途和实现方法。访问者模式是一种行为型设计模式,它允许你将算法从对象结构中分离出来,从而使算法可以独立于对象而变化。我们将通过开发中的示例和生活中的场景来说明访问者模式的应用场景,并给出相应的代码示例和输出结果。
200 1
Go设计模式(24)-访问者模式
访问者模式理解比较困难。可以认为对象开了一扇门,用来接收访问者,然后访问者便可在对象内部操作对象。简单来说,对象对访问者进行了授权。这样做能够实现对象和操作的解耦,职责更加单一。对象只管理自身,操作功能安置在访问者中。
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
11天前
|
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
27 3
阿里双十一背后的Go语言实践:百万QPS网关的设计与实现
解析阿里核心网关如何利用Go协程池、RingBuffer、零拷贝技术支撑亿级流量。 重点分享: ① 如何用gRPC拦截器实现熔断限流; ② Sync.Map在高并发读写中的取舍。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等