访问者模式
使用场景
一些对象结构相对固定。但经常需要对该对象进行定制化操作。这个时候我们可以用到访问模式。
- 那些结构固定的对象称为被受访者,它接受访问者的访问,并将自己做为参数,传递给访问者
- 使用固定对象进行相关操作的类被称为访问者,它在上述调用后,获得了受访者对象的引用,因而可以对其进行操作
优缺点
- 优点:将变化的访问跟实际的对象结构切分开来
- 缺点:访问者和被访问者互相依赖
一个demo
- 一个电脑有鼠标、键盘、显示器组成,这些组件都是受访者
- 访问者ComputerPartDisplayVisitor可以访问这些部分
受访者的统一抽象接口
public interface ComputerPart {
public void accept(ComputerPartVisitor computerPartVisitor);
}
一个具体的受访者实现:电脑的键盘部分
public class Keyboard implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
一个具体的受访者实现:电脑的显示器部分
public class Monitor implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
定义访问者的能访问哪些电脑部件接口:
public interface ComputerPartVisitor {
public void visit(Keyboard keyboard);
public void visit(Monitor monitor);
}
基于上述接口定义具体的访问行为:
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
@Override
public void visit(Keyboard keyboard) {
System.out.println("Displaying Keyboard.");
}
@Override
public void visit(Monitor monitor) {
System.out.println("Displaying Monitor.");
}
}
将具体某个电脑部件,交给访问者访问
public class VisitorPatternDemo {
public static void main(String[] args) {
//将键盘部分交给访问者访问
ComputerPart computer = new Keyboard();
computer.accept(new ComputerPartDisplayVisitor());
}
}
另外一个demo
在JSqlParser中源码中,一个SQL由多部分组成,比如where条件部分、排序部分。这些部分的个性化访问,也使用了访问者模式