一、访问者模式简介(Brief Introduction)
表示一个作用于某对象结构中的元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作,它把数据结构和作用于结构上的操作之间的耦合性解脱开,使的操作结合可以相对自由地演化。优点是增加新的操作很容易,因为增加一个新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问对象中。二、解决的问题(What To Solve)
访问者模式的目的是要把处理从数据结构分离出来。如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是个不错的选择,因为访问者模式使的算法操作的增加变的容易。相反,如果系统的数据结构不稳定,易于变化,则此系统就不适合使用访问者模式了。三、访问者模式分析(Analysis)
Visitor:访问者接口,为所有的访问者对象声明一个visit方法,用来代表为对象结构添加的功能,理论上可以代表任意的功能
ConcreteVisitor:具体的访问者实现对象,实现要真正被添加到对象结构中的功能
Element:抽象的元素对象,对象结构的顶层接口,定义接受访问的操作
ConcreteElement:具体元素对象,对象结构中具体的对象,也是被访问的对象,通常会回调访问者的真实功能,同时开放自身的数据供访问者使用
ObjectStructure:对象结构,通常包含多个被访问的对象,它可以遍历多个被访问的对象,也可以让访问者访问它的元素。可以是一个复合或者一个集合,如一个列表或无序集合
四、实例代码
1、Visitor接口及其实现
public interface Visitor {
public void visitConcreteElementA(ConcreteElementA concreteElementA);
public void visitConcreteElementB(ConcreteElementB concreteElementB);
}
public class ConcreteVisitorA implements Visitor {
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
concreteElementA.operationA();
}
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
concreteElementB.operationB();
}
}
2、抽象类Element及其实现
public abstract class Element {
public abstract void accept(Visitor visitor);
}
public class ConcreteElementA extends Element{
public void accept(Visitor visitor) {
visitor.visitConcreteElementA(this);
}
public void operationA(){
System.out.println("ConcreteElementA以实现功能");
}
}
public class ConcreteElementB extends Element{
public void accept(Visitor visitor) {
visitor.visitConcreteElementB(this);
}
public void operationB(){
System.out.println("ConcreteElementB以实现功能");
}
}
3、对象结构ObjectStructure
public class ObjectStructure {
private Collection<Element> col = new ArrayList<Element>();
public void handlerRequest(Visitor visitor){
for(Element ele:col){
ele.accept(visitor);
}
}
public void addElement(Element ele){
this.col.add(ele);
}
}
4、客户端调用
public class Client {
public static void main(String[] args) {
ObjectStructure os = new ObjectStructure();
Element elementA = new ConcreteElementA();
Element elementB = new ConcreteElementB();
os.addElement(elementA);
os.addElement(elementB);
Visitor visitor = new ConcreteVisitorA();
os.handlerRequest(visitor);
}
}
运行结果: