Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自
己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广
泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Visitor(访问者)模
式是比较常用的一个模式.
应用场景:对于某对象结构中各元素的操作。如果需要在不修改各元素类的前提
下定义作用于这些元素的新操作,也就是动态的增加新的方法应该考虑访问者模式。
想让数个不同的访问者对同一个对象集合进行访问时,Visitor模式可以发挥它
的强大作用。Visitor先调用了Visitable类中的方法,这个方法又回调到Visitor类中
7、 VisitorTest.java 带有main方法的测试类
=============== 1、 NodeA.java package visitor; public class NodeA implements Visitable { public void accept(Visitor visitor) { visitor.visit(this); } } =============== 1 end =============== 2、 NodeB.java package visitor; public class NodeB implements Visitable { public void accept(Visitor visitor) { visitor.visit(this); } } =============== 2 end =============== 3、 NodeC.java package visitor; public class NodeC implements Visitable { public void accept(Visitor visitor) { visitor.visit(this); } } =============== 3 end =============== 4、 Visitable.java package visitor; public interface Visitable { public void accept(Visitor visitor); } =============== 4 end =============== 5、 Visitor.java package visitor; import java.util.Collection; public interface Visitor { //访问节点A public void visit(NodeA nodeA); //访问节点B public void visit(NodeB nodeB); //访问节点C public void visit(NodeC nodeC); //访问节点集合 public void visitCollection(Collection collection); } =============== 5 end =============== 6、 VisitorA.java package visitor; import java.util.Collection; import java.util.Iterator; public class VisitorA implements Visitor { public void visit(NodeA a){ System.out.println("Execute visitNodeA method!");; } public void visit(NodeB b){ System.out.println("Execute visitNodeB method!");; } public void visit(NodeC c){ System.out.println("Execute visitNodeC method!");; } public void visitCollection(Collection collection){ Iterator iterator = collection.iterator(); while (iterator.hasNext()) { Object o = iterator.next(); if (o instanceof Visitable) ((Visitable)o).accept(this); } } } =============== 6 end =============== 7、 VisitorTest.java package visitor; import java.util.ArrayList; import java.util.List; public class VisitorTest { public static void main(String[] args) { NodeA nodeA = new NodeA(); NodeB nodeB = new NodeB(); NodeC nodeC = new NodeC(); VisitorTest nodeD = new VisitorTest(); //访问单个对象 VisitorA visitorA = new VisitorA(); visitorA.visit(nodeA); visitorA.visit(nodeB); visitorA.visit(nodeC); //访问集合 List<Visitable> list = new ArrayList<Visitable>(); list.add(nodeA); list.add(nodeB); list.add(nodeC); visitorA.visitCollection(list); } } =============== 7 end
老有新的Element元素类型加进来,可以变化的是访问者行为或操作,也就是
Visitor的不同子类可以有多种,这样使用访问者模式最方便.