美文网首页
设计模式——访问者模式

设计模式——访问者模式

作者: DevilRoshan | 来源:发表于2020-10-31 02:23 被阅读0次

什么是访问者模式?

封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

实现

// 人的抽象类。只有一个“接受”的抽象方法,它是用来获得“状态”对象的。
type Person interface {
    Accept(action Action)
}

type Man struct {
}

func NewMan() *Man  {
    return &Man{}
}

func (this *Man) Accept(action Action) {
    action.GetManAction(*this)
}

type Woman struct {
}

func NewWoman() *Woman  {
    return &Woman{}
}

func (this *Woman) Accept(action Action) {
    action.GetWomanAction(*this)
}

// 反应,男人反应,女人反应
type Action interface {
    GetManAction(man Man)
    GetWomanAction(woman Woman)
}
// Action 的具体上实现,成功,失败
type Success struct {
}

func NewSuccess() *Success  {
    return &Success{}
}

func (this *Success) GetManAction(man Man) {
    fmt.Println("男人成功...")
}

func (this *Success) GetWomanAction(woman Woman) {
    fmt.Println("女人成功...")
}

type Failure struct {
}

func NewFailure() *Failure  {
    return &Failure{}
}

func (this *Failure) GetManAction(man Man) {
    fmt.Println("男人失败...")
}

func (this *Failure) GetWomanAction(woman Woman) {
    fmt.Println("女人失败...")
}

// 结构对象
type ObjectStructure struct {
    elements []Person
}

func NewObjectStructure() *ObjectStructure  {
    return &ObjectStructure{}
}

func (this *ObjectStructure) Attach(person Person) {
    this.elements = append(this.elements, person)
}

func (this *ObjectStructure) Detach(person Person) {
    for idx, value := range this.elements {
        if value == person {
            this.elements = append(this.elements[:idx], this.elements[idx+1])
        }
    }
}

func (this *ObjectStructure) Display(action Action) {
    for _, person := range this.elements {
        person.Accept(action)
    }
}
func TestNewObjectStructure(t *testing.T) {
    objectStructure := NewObjectStructure()
    objectStructure.Attach(NewMan())
    objectStructure.Attach(NewWoman())
    // 成功
    success := NewSuccess()
    objectStructure.Display(success)
    // 失败
    failure := NewFailure()
    objectStructure.Display(failure)
}
// === RUN   TestNewObjectStructure
// 男人成功...
// 女人成功...
// 男人失败...
// 女人失败...
// --- PASS: TestNewObjectStructure (0.00s)
// PASS

优点

  • 符合单一职责原则;
  • 优秀的扩展性;
  • 灵活性非常高。

缺点

  • 具体元素对访问者公布细节,也就是说访问者关注了其他类的内部细节,这是迪米特法则所不建议的;
  • 具体元素变更比较困难;
  • 违背了依赖倒转原则。访问者依赖的是具体元素,而不是抽象元素。

使用场景

  • 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖与其具体类的操作,也就是用迭代器模式已经不能胜任的情景;
  • 需要对一个对结构中的对象进行很多不同并且不相关的操作,而你想避免让这些操作“污染”这些对象。

相关文章

  • [Android]设计模式-访问者模式

    [Android]设计模式-访问者模式 访问者模式 Visitor 【备注】只用于个人收藏

  • 设计模式[23]-访问者模式-Visitor Pattern

    1.访问者模式简介 访问者模式(Visitor Pattern)模式是行为型(Behavioral)设计模式,提供...

  • 设计模式之访问者(Visitor)

    访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式...

  • 访问者模式一篇就够了

    访问者模式介绍 最复杂的设计模式,并且使用频率不高,《设计模式》的作者评价为:大多情况下,你不需要使用访问者模式,...

  • 访问者模式

    访问者模式属于行为型模式。访问者模式是一种将数据结构和数据操作分离的设计模式。访问者模式比较复杂,而且实际使用的地...

  • Android设计模式——访问者模式(十一大行为型)

    1.访问者模式介绍 访问者模式时十一大行为型设计模式之一。 访问者模式是一种将数据操作与数据结构分...

  • 手撸golang 行为型设计模式 访问者模式

    手撸golang 行为型设计模式 访问者模式 缘起 最近复习设计模式拜读谭勇德的<<设计模式就该这样学>>本系列笔...

  • 25.访问者模式(行为型)

    访问者模式(行为型) 一、相关概述 访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成...

  • Java设计模式<访问者模式>

    Java设计模式<访问者模式> 意图 将对象的结构和操作分离 角色 抽象访问者:抽象类或者接口,声明访问者可以访问...

  • 访问者模式

    访问者模式属于行为变化模式。在GOF的《设计模式:可复用面向对象软件的基础》一书中对访问者模式是这样说的:表示一个...

网友评论

      本文标题:设计模式——访问者模式

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