己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广
泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Visitor(访问者)模
式是比较常用的一个模式.
下定义作用于这些元素的新操作,也就是动态的增加新的方法应该考虑访问者模式。
的强大作用。Visitor先调用了Visitable类中的方法,这个方法又回调到Visitor类中
=============== 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
在两个接口Visitor和Visitable中,确保Visitable很少变化,也就是说,确保不能
老有新的Element元素类型加进来,可以变化的是访问者行为或操作,也就是
Visitor的不同子类可以有多种,这样使用访问者模式最方便.