在Visitor模式中,我们使用一个访问者类来更改元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者的变化而变化.此模式属于行为模式类别.根据模式,元素对象必须接受访问者对象,以便访问者对象处理元素对象上的操作.
我们将创建一个 ComputerPart 接口,定义接受操作.键盘 ,鼠标,监视器和计算机是实现 ComputerPart 接口的具体类.我们将定义另一个接口 ComputerPartVisitor ,它将定义一个访问者类操作. 计算机使用具体访问者进行相应的操作.
VisitorPatternDemo ,我们的演示类,将使用计算机和 ComputerPartVisitor 类来演示访客模式的使用.
定义表示元素的接口.
ComputerPart.java
public interface ComputerPart { public void accept(ComputerPartVisitor computerPartVisitor); }
创建扩展上述类的具体类.
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); } }
定义代表访客的界面.
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); }
创建实现上述类的具体访客.
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."); } }
使用 ComputerPartDisplayVisitor 显示计算机的部分.
VisitorPatternDemo.java
public class VisitorPatternDemo { public static void main(String[] args) { ComputerPart computer = new Computer(); computer.accept(new ComputerPartDisplayVisitor()); } }
验证输出.
Displaying Mouse. Displaying Keyboard. Displaying Monitor. Displaying Computer.