设计模式--访问器(Visitor)模式

364 阅读1分钟

模式定义

表示一个作用于某对象结构中的各元素的操作,使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)

类图

在这里插入图片描述

要点总结

  • Visitor模式通过所谓双重分发(double dispatch)来实现在不更改(不添加新的操作-编译时)Element类层次结构的前提下,在运行时透明地为类层次结构上的各个类动态添加新的操作(支持变化)
  • 所谓双重分发即Visitor模式中间包括了两个多态分发:第一个为accept方法的多态辨析,第二个为visitElementX方法的多态辨析
  • Visitor模式的最大缺点在于扩展类层次结构(增加新的Element子类),会导致Visitor类的改变,因此Visitor模式适用于“Element类层次结构稳定,而其中的操作却经常面临频繁改动”

Go语言代码实现

工程目录

在这里插入图片描述

visitor.go

package Visitor

import "fmt"

type IVisitor interface {
   Visit()
}

type WeiBoVisitor struct {

}

func (w WeiBoVisitor) Visit(){
   fmt.Println("Visit WeiBo")
}

type IQIYIVisitor struct {

}

func (i IQIYIVisitor) Visit () {
   fmt.Println("Visit IQiYi")
}

type IElement interface {
   Accept(visitor IVisitor)
}

type Element struct {

}

func (e Element) Accept(v IVisitor) {
   v.Visit()
}

visitor_test.go

package Visitor

import "testing"

func TestElement_Accept(t *testing.T) {
   e := new(Element)
   e.Accept(new(WeiBoVisitor))
   e.Accept(new(IQIYIVisitor))
}