1 public class Client { 2 private static ObjectStructure Objects; 3 private static Visitor visitor; 4 public static void main(String[] args) { 5 //建立一个结构对象 6 Objects = new ObjectStructure(); 7 //给结构增长一个节点 8 Objects.add(new NodeA()); 9 //给结构增长一个节点 10 Objects.add(new NodeB()); 11 //建立一个新访问者 12 visitor = new VisitorA(); 13 //让访问者访问结构 14 Objects.action(visitor); 15 } 16 } 17 //抽象访问者 18 interface Visitor{ 19 //对应于nodeA的访问操做 20 void visit(NodeA node); 21 //对应于nodeB的访问操做 22 void visit(NodeB node); 23 24 } 25 //具体访问者A 26 class VisitorA implements Visitor{ 27 28 @Override 29 public void visit(NodeA node) { 30 System.out.println(node.operationA()); 31 } 32 33 @Override 34 public void visit(NodeB node) { 35 System.out.println(node.operationB()); 36 } 37 38 } 39 //具体访问者B 40 class VisitorB implements Visitor{ 41 42 @Override 43 public void visit(NodeA node) { 44 System.out.println(node.operationA()); 45 } 46 47 @Override 48 public void visit(NodeB node) { 49 System.out.println(node.operationB()); 50 } 51 52 } 53 //抽象结点 54 abstract class Node{ 55 //接受操做 56 public abstract void accept(Visitor visitor); 57 } 58 //具体节点A 59 class NodeA extends Node{ 60 61 @Override 62 public void accept(Visitor visitor) { 63 visitor.visit(this); 64 } 65 //nodeA的特有商业方法 66 public String operationA(){ 67 return "Node A is visited"; 68 } 69 } 70 //具体节点B 71 class NodeB extends Node{ 72 @Override 73 public void accept(Visitor visitor) { 74 visitor.visit(this); 75 } 76 //nodeA的特有商业方法 77 public String operationB(){ 78 return "Node B is visited"; 79 } 80 } 81 //结构对象角色,它持有一个汇集,并向外界提供add()方法做为对汇集的管理 操做,经过调用这个方法,能够动态地增长一个新的节点。 82 class ObjectStructure{ 83 private Vector nodes; 84 private Node node; 85 //构造方法 86 public ObjectStructure(){ 87 nodes = new Vector(); 88 } 89 //执行访问操做 90 public void action(Visitor visitor){ 91 for(Iterator it = nodes.iterator();it.hasNext();){ 92 node = (Node)it.next(); 93 node.accept(visitor); 94 } 95 } 96 97 //增长一个新的元素 98 public void add(Node node){ 99 nodes.add(node); 100 } 101 } 102 //此示意性实现中并无出现一个复杂的具备多个树枝节点的对象树结构,可是,在实际系统中访问者模式一般用来处理复杂的对象树结构的,并且 103 //访问者模式能够用来处理跨越多个等级结构的树结构问题。这正是访问者模式的功能强大之处。