美文网首页
访问者模式

访问者模式

作者: 小幸运Q | 来源:发表于2021-02-28 15:50 被阅读0次

在不更改这个类的前提下,更改这个类中方法所能执行的逻辑。即根据外部环境(传入的访问者Visitor不同)更改这个类所能执行的行为。

将数据结构与数据操作分离,实现稳定的数据结构和易变的操作耦合问题。

image.png image.png
  • Visitor中定义了对被访问者Element的操作,ObjectStruct作为容器存储了Element队列并且开放了Visitor的访问。每个Element都有调用动态visitor方法的accept
package main

import "fmt"

type Visitor interface {
    VisitConcreteElementA(*ConcreteElementA)
    VisitConcreteElementB(*ConcreteElementB)
}

type ConcreteVisitor1 struct {
}

func (v *ConcreteVisitor1) VisitConcreteElementA(ele *ConcreteElementA) {
    ele.Operation()
}

func (v *ConcreteVisitor1) VisitConcreteElementB(ele *ConcreteElementB) {
    ele.Operation()
}

type Element interface {
    accept(Visitor)
}

type ConcreteElementA struct {
}

func (e *ConcreteElementA) accept(visitor Visitor) {
    visitor.VisitConcreteElementA(e)
}

func (e *ConcreteElementA) Operation() {
    fmt.Println("eleA operation")
}

type ConcreteElementB struct {
}

func (e *ConcreteElementB) accept(visitor Visitor) {
    visitor.VisitConcreteElementB(e)
}

func (e *ConcreteElementB) Operation() {
    fmt.Println("eleB operation")
}

type ObjectStructure struct {
    col []Element
}

func (o *ObjectStructure) accept(visitor Visitor) {
    for _, e := range o.col {
        e.accept(visitor)
    }
}
func (o *ObjectStructure) addElement(ele ...Element) {
    for _, e := range ele {
        o.col = append(o.col, e)
    }
}

func main() {
    os := new(ObjectStructure)
    eleA := new(ConcreteElementA)
    eleB := new(ConcreteElementB)

    os.addElement(eleA, eleB)
    visitor := new(ConcreteVisitor1)
    os.accept(visitor)
}

相关文章

网友评论

      本文标题:访问者模式

      本文链接:https://www.haomeiwen.com/subject/vxsufltx.html