什么是visitor模式
访问者模式,《JAVA与模式》这本书中提到的一句: 访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这些操作的数据结构则可以保持不变。
我们先来理解一下这句话的意思,目的是封装对于数据结构元素的操作。首先,提出三个问题,这句话的封装是什么意思?这句话指的数据结构是什么?对于数据结构的操作又是什么?
有些官方语句之所以难理解就是因为它太抽象了,能使它容易理解那么就必须先化抽象为具体,然后再从具体去看抽象。
在visitor模式中运用到了一个最核心的理念就是双分派,何为双分派呢?既然是双,那么必定存在两个角色,这两个角色是什么呢?在访问者模式里面肯定是访问者和被访问者。
我们再来看看上面那句话,刚刚还有两个疑问分别是这句话的数据结构是什么?这句话的操作又是什么?其实我们可以直接理解为数据结构就是被访问者,操作就是访问者,封装就是通过双分派机制来使操作去拥有数据结构并且能对数据结构进行改变,而数据结构(元素)同时也接受一个操作对象(访问者),当操作改变的时候,我们再利用面向抽象编程就可以轻松地分离出操作而不改变数据结构了。
visitor模式UML图

Visitor: 抽象访问者,为具体访问者声明一个visit方法,注意的是这里的visit方法数量是根据访问者类型多少而决定的。
ConcreteVisitor: 具体访问者,实现了visit方法,是对于访问者操作的具体实现
Element: 被访问的数据结构的抽象类,定义了一个accept方法用来接受一个访问者对象。
ConcreteElement: 被访问者的数据结构的具体实现类,实现accept方法。accept方法接受一个访问者,让后这里面会调用访问者的具体visit方法,然后再将自己作为对象传入这个访问者的具体visit方法中,在这个visit方法中就会调用一些对于对象进行操作的方法。
ObjectStructure: 这个类其实对于整个设计模式中关联性不是很强,可以忽略,它的作用就是将上述的Element放入一个集合中,可能我们会对这个集合进行遍历然后再进行操作等。