1.用意
封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。
2.类图
3.代码
/*
* 模式中的抽象节点
*/
public abstract class Node {
public abstract void accept(Visitor visitor);
}
/*
* 具体Node角色A
*/
public class NodeA extends Node {
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String operationA() {
return "Node A is visited";
}
}
/*
* 具体Node角色B
*/
public class NodeB extends Node {
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String operationB() {
return "Node B is visited";
}
}
/*
* 抽象访问者
*/
public interface Visitor {
void visit(NodeA node);
void visit(NodeB node);
}
/*
* 具体访问者A
*/
public class VisitorA implements Visitor {
public void visit(NodeA nodeA) {
S.s(nodeA.operationA());
}
public void visit(NodeB nodeB) {
S.s(nodeB.operationB());
}
}
/*
* 具体访问者B
*/
public class VisitorB implements Visitor {
public void visit(NodeA nodeA) {
S.s(nodeA.operationA());
}
public void visit(NodeB nodeB) {
S.s(nodeB.operationB());
}
}
/*
* 结构对象
*/
public class ObjectStructure {
private Vector nodes;
private Node node;
public ObjectStructure() {
nodes = new Vector();
}
/*
* 执行访问操作
*/
public void action(Visitor visitor) {
for(Enumeration e = nodes.elements();e.hasMoreElements();){
node = (Node)e.nextElement();
node.accept(visitor);
}
}
public void add(Node node) {
nodes.addElement(node);
}
}
/*
* 测试类
*/
public class Test {
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);
}
}
总结:结构对象中的Node对象的操作在visitor中控制,可以修改操作,但数据结构不用改。
z