三十三、访问者模式

1. 何为访问者模式

访问者模式是指封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

访问者模式:表示一个作用于某对象结构中的各元素的操作。它让我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

访问者模式模式图

Visitor(访问者) :为该对象结构中 ConcreteElement的每一个类声明一个 Visit操作.该操作的名字和特征标识了发送 Visit请求给该访问者的那个类.这使得访问者可以确定正被访问元素 的具体的类.这样访问者就可以通过该元素的特定接口直接访问它.

ConcreteVisitor(具体访问者): 实现每个由 Visitor声明的操作.每个操作实现本算法的一部分,而该算法片断乃是对应于结构中对象的类。ConcreteVisitor为该算法提供了上下文并存储它的局部状态.这一状态常常在遍历该结构的过程中累积结果.

Element(元素) :定义一个Accept操作,它以一个访问者为参数。

ConcreteElement(具体元素) :实现Accept操作,该操作以一个访问者为参数.

ObjectStructure(对象结构) :能枚举它的元素,可以提供一个高层的接口以允许该访问者访问它的元素, 可以是一个复合(参见Composite组合模式)或是一个集合,如一个列表或一个无序集合.

2. 何时使用访问者模式

在以下场景,可以使用访问者模式:

  • 一个复杂的对象结构包含很多其他对象,他们有不同的接口(比如组合体),但是想对这些对象实施一些依赖于其具体类型的操作。
  • 需要对一个组合结构中的对象进行很多不相关的操作,但是不想让这些操作“污染”这些对象类。可以将相关的操作集中起来,定义在一个访问者类中,并在需要在访问者中定义的操作时使用它。
  • 定义复杂结构的类很少做修改,单经常需要向其添加新的操作。

3. 代码演示

class Person {
    func accept(visitor: PlaceVisitor) {

    }
}

class Boss: Person {
    override func accept(visitor: PlaceVisitor) {
        visitor.visitor(boss: self)
    }
}

class Employee: Person {
    override func accept(visitor: PlaceVisitor) {
        visitor.visitor(emplyee: self)
    }
}

// 定义访问行为
class PlaceVisitor {
    func visitor(boss: Boss) {
        
    }
    
    func visitor(emplyee: Employee) {
        
    }
}

class HourseVisitor: PlaceVisitor {
    override func visitor(boss: Boss) {
        print("老板在家埋头工作")
    }
    
    override func visitor(emplyee: Employee) {
        print("员工在家看电视聊天")
    }
}

class OfficeVisitor: PlaceVisitor {
    override func visitor(boss: Boss) {
        print("老板在办公室进行商务拓展")
    }
    
    override func visitor(emplyee: Employee) {
        print("员工在办公室认真工作")
    }
}

let boss: Boss = Boss()
let employee: Employee = Employee()

let houseVisitor: PlaceVisitor = HourseVisitor()
let officeVisitor: PlaceVisitor = OfficeVisitor()

boss.accept(visitor: houseVisitor)
employee.accept(visitor: houseVisitor)

boss.accept(visitor: officeVisitor)
employee.accept(visitor: officeVisitor)

演示结果:

老板在家埋头工作
员工在家看电视聊天
老板在办公室进行商务拓展
员工在办公室认真工作
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容