访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式,属于行为模式类别。
访问者模式实例
无涯教程将创建一个定义接受操作的 ComputerPart 接口,Keyboard,Mouse,Monitor和Computer是实现 ComputerPart 接口的具体类。将定义另一个接口 ComputerPartVisitor ,它将定义访问者类操作。 计算机使用具体的访问者来执行相应的操作。
演示类 VisitorPatternDemo 将使用 Computer 和 ComputerPartVisitor 类来演示访问者模式的使用。

第1步 - 定义ComputerPart接口。
ComputerPart.java
public interface ComputerPart { public void accept(ComputerPartVisitor computerPartVisitor); }
第2步 - 创建扩展上述类的具体类。
Keyboard.java
public class Keyboard implements ComputerPart {@Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } }
Monitor.java
public class Monitor implements ComputerPart {@Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } }
Mouse.java
public class Mouse implements ComputerPart {@Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } }
Computer.java
public class Computer implements ComputerPart {ComputerPart[] parts;
public Computer(){ parts=new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()}; }
@Override public void accept(ComputerPartVisitor computerPartVisitor) { for (int i=0; i < parts.length; i++) { parts[i].accept(computerPartVisitor); } computerPartVisitor.visit(this); } }
第3步 - 定义一个代表访客的接口。
ComputerPartVisitor.java
public interface ComputerPartVisitor { public void visit(Computer computer); public void visit(Mouse mouse); public void visit(Keyboard keyboard); public void visit(Monitor monitor); }
第4步 - 创建实现上述类的具体访客。
ComputerPartDisplayVisitor.java
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {@Override public void visit(Computer computer) { System.out.println("Displaying Computer."); }
@Override public void visit(Mouse mouse) { System.out.println("Displaying Mouse."); }
@Override public void visit(Keyboard keyboard) { System.out.println("Displaying Keyboard."); }
@Override public void visit(Monitor monitor) { System.out.println("Displaying Monitor."); } }
第5步 - 使用 ComputerPartDisplayVisitor 显示 Computer 的部分。
VisitorPatternDemo.java
public class VisitorPatternDemo {
public static void main(String[] args) {
</span><span class="typ">ComputerPart</span><span class="pln"> computer</span><span class="pun">=</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Computer</span><span class="pun">();</span><span class="pln">
computer</span><span class="pun">.</span><span class="pln">accept</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ComputerPartDisplayVisitor</span><span class="pun">());</span><span class="pln">
}
}
第6步 - 验证输出。
Displaying Mouse. Displaying Keyboard. Displaying Monitor. Displaying Computer.