Visitor访问者模式定义
作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.
被访问者抽象类Node.java
package com.javapatterns.visitor.visitorsimplified;
abstract public class Node
{
public abstract void accept(Visitor visitor);
/** @link dependency */
/*# Visitor lnkVisitorA; */
}
被访问者实现类NodeA .java
package com.javapatterns.visitor.visitorsimplified;
public class NodeA extends Node
{
public void accept(Visitor visitor)
{
visitor.visit(this);
}
public String operationA()
{
return "NodeA is visited";
}
}
被访问者实现类NodeB .java
package com.javapatterns.visitor.visitorsimplified;
public class NodeB extends Node
{
public void accept(Visitor visitor)
{
visitor.visit(this);
}
public String operationB()
{
return "NodeB is visited";
}
}
访问者类Visitor.java
package com.javapatterns.visitor.visitorsimplified;
public class Visitor
{
public void visit(NodeA nodeA)
{
System.out.println( nodeA.operationA() );
}
public void visit(NodeB nodeB)
{
System.out.println( nodeB.operationB() );
}
}
增加与迭代被访问者类ObjectStructure.java
package com.javapatterns.visitor.visitorsimplified;
import java.util.Vector;
import java.util.Enumeration;
public class ObjectStructure
{
private Vector nodes;
/**
* @link aggregation
*/
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);
}
}
客户端类Client.java
package com.javapatterns.visitor.visitorsimplified;
public class Client
{
private static ObjectStructure aObjects;
private static Visitor visitor;
static public void main(String[] args)
{
aObjects = new ObjectStructure();
aObjects.add(new NodeA());
aObjects.add(new NodeB());
visitor = new Visitor();
aObjects.action(visitor);
}
}
这种设计模式一般是用在数据类型固定不变的情况下,其实我很想把访问者模式用在通用页面的数据访问中,因为所有的
网页无非就是下拉,文本,单选,多选,文件等可以确定的数据结构,然后其做成标签,在后台action取值的时候,只要
把这些标签类put到ObjectStructure中,就可以取到值。目前正在思考,如何很好的实现。如果这样实现,那么扩展
的时候,既可以满足开闭 原则,当然也满足松耦合性的原则。
其次:访问者模式与适配器模式相结合,那么就可以更加完美的体现开闭原则。如果多一种类型,只要再接口中增加一个
方法,就可以自如的使用了。呵呵,很好的哦。