共计 833 个字符,预计需要花费 3 分钟才能阅读完成。
模式定义
示意一个作用于某对象构造中的各元素的操作,使得能够在不扭转(稳固)各元素的类的前提下定义(扩大)作用于这些元素的新操作(变动)
类图
要点总结
- 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))
}
正文完