结构对象会遍历它自己所保存的聚集中的所有节点,在本系统中就是节点NodeA和NodeB。首先NodeA会被访问到,这个访问是由以下的操作组成的:
(1)NodeA对象的接受方法accept()被调用,并将VisitorA对象本身传入;
(2)NodeA对象反过来调用VisitorA对象的访问方法,并将NodeA对象本身传入;
(3)VisitorA对象调用NodeA对象的特有方法operationA()。
从而就完成了双重分派过程,接着,NodeB会被访问,这个访问的过程和NodeA被访问的过程是一样的,这里不再叙述。
适用于 数据结构稳定,再增加就比较困难
/** * Created by nicknailo on 2018/9/1. */ public class VisitorDesign { public static void main(String[] args) { //创建一个结构对象 ObjectStructure os = new ObjectStructure(); //给结构增加一个节点 os.add(new NodeA()); //给结构增加一个节点 os.add(new NodeB()); //创建一个访问者 Visitor visitor = new VisitorB(); os.action(visitor); } } interface Visitor { /** 对应于NodeA的访问操作 */ public void visit(NodeA node); /** 对应于NodeB的访问操作 */ public void visit(NodeB node); } class VisitorA implements Visitor { /** 对应于NodeA的访问操作 */ @Override public void visit(NodeA node) { System.out.println(node.operationA()); } /** 对应于NodeB的访问操作 */ @Override public void visit(NodeB node) { System.out.println(node.operationB()); } } class VisitorB implements Visitor { /** 对应于NodeA的访问操作 */ @Override public void visit(NodeA node) { System.out.println(node.operationA()); } /** 对应于NodeB的访问操作 */ @Override public void visit(NodeB node) { System.out.println(node.operationB()); } } interface Node { /** 接受操作 */ public abstract void accept(Visitor visitor); } class NodeA implements Node{ /** 接受操作 */ @Override public void accept(Visitor visitor) { visitor.visit(this); } /** NodeA特有的方法 */ public String operationA(){ return "NodeA"; } } class NodeB implements Node{ /** 接受方法 */ @Override public void accept(Visitor visitor) { visitor.visit(this); } /** NodeB特有的方法 */ public String operationB(){ return "NodeB"; } } class ObjectStructure { private List<Node> nodes = new ArrayList<Node>(); /** 执行方法操作 */ public void action(Visitor visitor) { for(Node node : nodes) { node.accept(visitor); } } /** 添加一个新元素 */ public void add(Node node){ nodes.add(node); } }
运行后
NodeA
NodeB