关于设计模式:设计模式访问器Visitor模式

模式定义

示意一个作用于某对象构造中的各元素的操作,使得能够在不扭转(稳固)各元素的类的前提下定义(扩大)作用于这些元素的新操作(变动)

类图

要点总结

  • 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))
}

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据