访问者模式

定义

访问者模式( Visitor Pattern)是一种将数据结构与数据操作分离的设计模式。是指封装些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。属于行为型模式。

​ 访问者模式被称为最复杂的设计模式,并且使用频率不高,设计模式的作者也评价为:

​ 大多情况下,你不需要使用访问者模式,但是一旦需要使用它时,那就真的需要使用了。

​ 访问者模式的基本思想是,针对系统中拥有固定类型数的对象结构(元索),在其内提供一个 accept0 方法用来接受访问者对象的访问。

​ 不同的访问者对同一元素的访问内容不同,使得相同的元素集合可以产生不同的数据结果。

​ accept(方法可以接收不同的访问者对象然后在内部将自已(元柰)转发到接收到的访问者对象的 visite0方法内。访问者内部对应类型的 Visit0方法就会得到回调执行,对元索进行操作。

​ 也就是通过两次动态分发(第一次是对访问者的分发 accept)方法, 第二次是对元素的分发 visit(0方法),オ最终将一个具体的元素传递到一个具体的访问者。

​ 如此来,就解耦了数据结构与操作,且数据操作不会改变元素状态。

​ 访问者模式的核心是,解耦数据结枃与数据操作,使得对元素的操作具备优秀的扩展性。可以通过扩展不同的数据操作类型(访问者)实现对相同元素集的不同的操作

应用场景

  • 访问者模式在生活场景中也是非常当多的,例如每年年底的KP考核

    • KPI考核标准是相对稳定的

      • 但是参与KP考核的员工可能每年都会发生变化,那么员工就是访问者。

  • ​ 我们平时去食堂或者餐厅吃饭,

    • 餐厅的菜单和就餐方式是相对稳定的

      • 但是去餐厅就餐的人员是每天都在发生变化的,因此就餐人员就是访问者。

​ 当系统中存在类型数目稳定(固定)的一类数据结构时,可以通过访者模式方便地实现对该类型所有数据结构的不同操作,而又不会数据产生任何副作用(脏数据)。 ​ 简言之,就是对集合中的不同类型数据(类型数量稳定)进行多种操作,则使用访问者模式。

适用场景

  • 数据结构稳定,作用于数据结构的操作经常变化的场景

  • 需要数据结构与数据操作分离的场景

  • 需要对不同数据类型(元素)进行操作,而不使用分支判断具体类型的场景。

通用UML图

  • 抽象访问者( Visitor)

    • 接口或抽象类,该类地冠以了对每一个具体元素( Element)的访问行为

    • (visit)方法,其参数就是具体的元素( Element)对象。

    • 理论上来说, Visitor的方法个数与元素( Element)个数是相等的。如果元素( Element)个数经常变动,会导致 Visitor的方法也要进行变动,此时,该情形并不适用访问者模式

  • 具体访问者( Concretevisitor)

    • 实现对具体元素的操作

  • 抽象元素( Element):

    • 接口或抽象类,定义了一个接受访问者访问的方法 accept(,表示所有元素类型都支持被访问者访问

  • 具体元素( oncrete Element):具体元素类型,提供接受访问者的具体实现。通常的实现都为: visitor. visit(this)

  • 结构对象( Objectstruture)

    • 该类内部维护了元索集合,并提供方法接受访问者对该集合所有元素进行操作。

访问者为什么设计成组合,不设计成抽象父类

重载静态分配和动态分配

源码

FileVisitor

SimpleFileVisitor

  • 而提供了遍历文件的前置后置等方法

BeanDefinitionVisitor

把结构和操作做分离

总结

优缺点

有点

Last updated