传送门:https://www.runoob.com/design-pattern/visitor-pattern.html
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。
UML如下:
注:ASM操作字节码就是通过访问者模式进行的字节码增强。
主要解决:稳定的数据结构和易变的操作耦合问题。
优点: 1、符合单一职责原则。 2、优秀的扩展性。 3、灵活性。
缺点: 1、具体元素对访问者公布细节,违反了迪米特原则。 2、具体元素变更比较困难。 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。
个人理解:
首先访问者模式是个行为模式,根据不同的访问者表现出不同的行为。前提是有个稳定的模型(不管是业务的还是数据的),也就是说一个访问者访问固定模型,该模型根据访问者的不同,产生不同的行为。
实现上:
一组业务模式,由多个逻辑组成;每个逻辑都可以看做是一个元素。所谓稳定的模型指的是这个业务逻辑固定,也就是内部执行逻辑是固定的逻辑A->逻辑B->逻辑C的顺序。
这个业务模式有个公共的接口,我们叫它元素接口,这个接口有个accept(visitor)方法,入参是访问者接口。每个实现了元素接口的类就是一个元素。每个元素类实现accept方法,然后调用访问者接口的visit(this)方法,visit方法的入参就是元素类自己。最后一个元素类不同,它除了实现accept接口外,内部还要定义出其他元素的实例数组,在重写accept方法时,首先遍历这个实例数组,调用每个实例的accept方法。最后遍历完成后,才是这个元素类自己要调用访问者接口的visit(this)方法。
访问者接口有多个不同入参的visit方法,有多少元素类就有多少visit方法,每个元素对应一个visit方法作为入参。访问者的实现类需要实现全部不同入参的visit方法,也就是每个访问者类里有全部元素对应的处理逻辑,只是处理顺序是固定的。具体逻辑是按照每个访问者类的实现来执行。