定义
表示一个作用于某个对象结构的各元素的操作。他是你可以在不改变元素的类的前提下定义作用于这些元素的操作
结构与说明
Visitor : 访问者接口,为所有的访问者申明一个visit的方法,用来代表为对象结构添加的功能
ConcreteVisitor : 具体的访问者实现对象,实现visit中的方法
Element : 抽象元素对象,即被访问的对象,通常会回调访问者的真实功能,需要定义一个accept方法接受visitor对象,或者定义一个visitor的成员对象,使用set方法传递,建议accept方法,即传即用。
ConcreteElement: 实现accept方法,一般直接调用visitor.visit(this)方法;参数可以自定义。
ObjectStructure : 对象结构,通常包含对于被访问的对象。
实现
public interface Visitor{
//对A元素遍历操作
public void visitA(ElementA A);
//对B元素遍历操作
public void visitB(ElementB B);
}
public class ConcreteVisitor1 implemets Visitor{
//对A元素遍历操作
public void visitA(ElementA A){
doSomething;
通常会调用A的一些函数,一起完成操作
}
//对B元素遍历操作
public void visitB(ElementB B){
doSomething;
通常会调用B的一些函数,一起完成操作
}
}
//其他的访问方式
public class ConcreteVisitor2 implemets Visitor{
.....
}
public abstract class Element{
public abstract void accept(Visitor visitor);
}
public class ElementA extends Element{
....//封装的函数和数据
public void accept(Visitor visitor){
visitor.visit(this)
}
}
public class ElementB extends Element{
....//封装的函数和数据
public void accept(Visitor visitor){
visitor.visit(this)
}
}
public class ObjectStructure{
private Collection<Element> col = new ArrayList<Element>();
public void handleRequest(Visitor visitor)
{
for(Element e :col){
e.accept(visitor);
}
}
//其他的一些函数和成员的封装
}
使用访问者模式,实现了两次分发技术,即accept和visit各一次,就本质而言:预留同路,回调实现
No Final is final
By Xu.j.h