在访问者模式中,有三个关键组件:
- 访问者(Visitor):它是一个接口或抽象类,声明了对对象层次结构中每个类的访问方法。每个访问方法对应于可以在对象上执行的特定操作。
- 具体访问者(Concrete Visitor):它是实现了访问者接口的具体类,提供了对对象的具体操作。
- 元素(Element):它是对象层次结构中的类,定义了接受访问者的接口。
- 具体元素(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)
}