visitor 抽象访问者
抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法的参数定义哪些对象可以被访问的。
concreteVisitor 具体访问者
它影响访问者访问到一个类后该怎么干,要做什么事情。
element 抽象元素
接口或者抽象类,声明接受那一类访问者访问,程序上市通过accept方法中的参数来定义的。
concreteElement 具体元素
实现accept 方法,通常是visitor。visit(this) 基本上都形成了一种模式了
objectStruture 结构对象
元素产生者,一般容纳在多个不同类,不同接口的容器
访问者 访问什么?
被访问者 接受 谁访问?
public class Client {
private static ObjectStructure aObjects;
private static Visitor visitor;
public static void main(String[] args) {
aObjects = new ObjectStructure();
aObjects.add(new NodeA());
aObjects.add(new NodeB());
visitor = new VisitorA();
aObjects.action(visitor);
}
}
public interface Visitor {
//访问者 访问什么?
void visit(NodeA node);
void visit(NodeB node);
}
public class VisitorA implements Visitor{
@Override
public void visit(NodeA node) {
System.out.println(node.operationA());
}
@Override
public void visit(NodeB node) {
System.out.println(node.operateionB());
}
}
public class VisitorB implements Visitor{
public void visit(NodeA nodeA){
System.out.println(nodeA.operationA());
}
@Override
public void visit(NodeB node) {
System.out.println(node.operateionB());
}
}
abstract public class Node {
//接受谁 访问
public abstract void accept(Visitor visitor);
}
public class NodeA extends Node{
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String operationA(){
return "NodeA is visited";
}
}
public class NodeB extends Node{
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String operateionB(){
return "Node B is visited";
}
}
import java.util.Enumeration;
import java.util.Vector;
/**
聚集:被访问者要接受那些访问者访问
*
* @describe
* @time 2014-7-2 上午11:47:11
*/
public class ObjectStructure {
private Vector<Node> nodes;
private Node node;
public ObjectStructure(){
nodes = new Vector();
}
public void action(Visitor visitor){
for(Enumeration<Node> e = nodes.elements();e.hasMoreElements();){
node = e.nextElement();
node.accept(visitor);
}
}
public void add(Node node){
nodes.addElement(node);
}
}