访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作。
UML图如下:
Vistor:为该对象结构中的ConcreteElement的每一个类声明一个visit操作。
ConcreteVistor:具体访问者,实现每个由Visitor声明的操作。每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类。
Elment:定义一个accept的操作,它以一个访问者为参数
ConcreteElement:具体元素,实现Accept操作
ObjectStructure:能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素
具体代码如下:
1、Visitor类
<span style="font-size:18px;">public abstract class Visitor
{
abstract void visitConcreteElementA(ConcreteElementA elementA);
abstract void visitConcreteElementB(ConcreteElementB elementB);
}</span>
2、Element类
<span style="font-size:18px;">public abstract class Element
{
abstract void accept(Visitor visitor);
}
</span>
3、具体Element类
<span style="font-size:18px;">public class ConcreteElementA extends Element
{
@Override
void accept(Visitor visitor)
{
// TODO Auto-generated method stub
visitor.visitConcreteElementA(this);
}
}
class ConcreteElementB extends Element
{
@Override
void accept(Visitor visitor)
{
// TODO Auto-generated method stub
visitor.visitConcreteElementB(this);
}
} </span>
4、具体Visitor类
<span style="font-size:18px;">public class ConcreteVisitorA extends Visitor
{
@Override
void visitConcreteElementA(ConcreteElementA elementA)
{
// TODO Auto-generated method stub
System.out.println(this.getClass().getName().substring(23)+"访问"+elementA.getClass().getName().substring(23));
}
@Override
void visitConcreteElementB(ConcreteElementB elementB)
{
// TODO Auto-generated method stub
System.out.println(this.getClass().getName().substring(23)+"访问"+elementB.getClass().getName().substring(23));
}
}
class ConcreteVisitorB extends Visitor
{
@Override
void visitConcreteElementA(ConcreteElementA elementA)
{
// TODO Auto-generated method stub
System.out.println(this.getClass().getName().substring(23)+"访问"+elementA.getClass().getName().substring(23));
}
@Override
void visitConcreteElementB(ConcreteElementB elementB)
{
// TODO Auto-generated method stub
System.out.println(this.getClass().getName().substring(23)+"访问"+elementB.getClass().getName().substring(23));
}
}
</span>
5、ObjectStructure类
<span style="font-size:18px;">import java.util.ArrayList;
import java.util.List;
public class ObjectStructure
{
private List<Element> elements = new ArrayList<Element>();
public void attach(Element element)
{
elements.add(element);
}
public void detach(Element element)
{
elements.remove(element);
}
public void accept(Visitor visitor)
{
for(Element e:elements)
{
e.accept(visitor);
}
}
}</span>
6、Client类
<span style="font-size:18px;">public class Client
{
public static void main(String[] args)
{
ObjectStructure o = new ObjectStructure();
o.attach(new ConcreteElementA());
o.attach(new ConcreteElementB());
ConcreteVisitorA va=new ConcreteVisitorA();
ConcreteVisitorB vb=new ConcreteVisitorB();
o.accept(va);
o.accept(vb);
}
}
</span>
访问者模式适用于数据结构相对稳定的系统,它的目的是把处理从数据结构分离出来。
优点:在于很容易增加新的操作。因为增加新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问者对象中。
缺点:很难增加新的数据结构。
资料来源:程杰老师<大话设计模式>