1、定义:是一种将数据结构与数据操作分离的设计模式。是指封装一些作用于某种数据结构中的各元素的操作。属于行为型模式。
2、特征:可以在不改变数据结构的前提下定义作用于这些元素的新操作。
3、适用场景:
a.数据结构稳定,作用于数据结构的操作经常变化的场景;
b.需要数据结构与数据操作分离的场景;
c.需要对不同数据类型(元素)进行操作,而不使用分支判断具体类型的场景。
4、优点:
a.解耦了数据结构与数据操作,使得操作集合可以独立变化;
b.扩展性好:可以通过扩展访问者角色,实现对数据集的不同操作;
c.元素具体类型并非单一,访问者均可操作;
d.各角色职责分离,符合单一职责原则。
5、缺点:
a.无法增加元素类型:若系统数据结构对象易于变化,经常有新的数据对象增加进来,则访问者类必须增加对应元素类型的操作,违背了开闭原则;
b.具体元素变更困难:具体元素增加属性,删除属性等操作会导致对应的访问者类需要进行相应的修改,尤其当有大量访问者类时,修改范围太大;
c.违背依赖倒置原则:为了达到“区别对待”,访问者依赖的是具体元素类型,而不是抽象。
6、源码中的体现:jdk中的FileVisitor,spring中的BeanDefinitionVisitor。