访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。它包括以下角色:
1.访问者角色(Visitor):为该对象结构中ConcreteElement的每一个类声明一个Visit方法。
2.具体访问者角色(ConcreteVisitor):实现每个由Visitor声明的操作。每个操作实现算法的一部分。
3.元素角色(Element):定义一个Accept操作,它以一个访问者为参数。
4.具体元素(ConcreteElement):实现Accept操作。
5.对象结构角色(ObjectStructure):能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。
UML图如下:
代码如下:
访问者角色代码(Visitor):
public interface Visitor
{
//访问元素A的操作
void visitConcreteElementA(ConcreteElementA concreteElement);
//访问元素B的操作
void visitConcreteElementB(ConcreteElementB ConcreteElement);
}
具体访问者角色代码(ConcreteVisitor):
public class ConcreteVisitorA implements Visitor
{
public void visitComcrecteElementA(ComcrecteElementA comcrecteElement)
{
System.out.println( comcrecteElement.operationA() );
}
public void visitComcrecteElementB(ComcrecteElementB comcrecteElement)
{
System.out.println( comcrecteElement.operationB() );
}
}
public class ComcreteVisitorB implements Visitor
{
public void visitComcrecteElementA(ComcrecteElementA comcrecteElement)
{
System.out.println( comcrecteElement.operationA() );
}
public void visitComcrecteElementB(ComcrecteElementB comcrecteElement)
{
System.out.println( comcrecteElement.operationB() );
}
}
元素角色(Element)代码:
public abstract class Element
{
public abstract void accept(Visitor visitor);
}
具体元素角色(ConcreteElement)代码:
public class ConcreteElementA extends Element
{
public void accept(Visitor visitor)
{
visitor.visitConcreteElementA(this);
}
public String operationA()
{
return "ConcreteElementA is visited";
}
}
public class ConcreteElementB extends Element
{
public void accept(Visitor visitor)
{
visitor.visitConcreteElementB(this);
}
public String operationB()
{
return "ConcreteElementB is visited";
}
}
对象结构角色(ObjectStructure)代码:
public class ObjectStructure
{
private Vector vector;
private Element element;
//构造方法
public ObjectStructure()
{
vector = new Vector();
}
//执行访问操作
public void action(Visitor visitor)
{
for(Enumeration e = vector.elements();e.hasMoreElements();)
{
element = (Element)e.nextElement();
element.accept(visitor);
}
}
//增加一个新元素
public void add(Element element)
{
vector.addElement(element);
}
}