访问者模式
定义
访问者模式( 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