一、定义
表示一个作用于某对象结构中的各元素的操作。它是你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式把数据结构和作用于数据结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。
访问者模式的目的是把操作处理从数据结构中分离出来。
二、结构图
三、代码示例
1、测试代码Action.java
/**
* @use 访问者模式
* @author lattice
* @date 2017-01-10
*/
public class Action {
public static void main(String[] args) {
ObjectStructure o =new ObjectStructure();
o.attach(new ConcreteElementA());
o.attach(new ConcreteElementB());
ConcreteVisitorA visitA=new ConcreteVisitorA();
ConcreteVisitorB visitB=new ConcreteVisitorB();
o.accept(visitA);
System.out.println("****************");
o.accept(visitB);
/**
* 输出结果
com.lattice.visitor.ConcreteElementA被com.lattice.visitor.ConcreteVisitorA访问
com.lattice.visitor.ConcreteElementB被com.lattice.visitor.ConcreteVisitorA访问
****************
com.lattice.visitor.ConcreteElementA被com.lattice.visitor.ConcreteVisitorB访问
com.lattice.visitor.ConcreteElementB被com.lattice.visitor.ConcreteVisitorB访问
*/
}
}
2、访问者代码Visitor.java
import java.util.ArrayList;
/**
* 访问者
* @author lattice
*
*/
public abstract class Visitor {
public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}
/**
* 具体访问者
* @author lattice
*
*/
class ConcreteVisitorA extends Visitor{
@Override
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println(concreteElementA.getClass().getName()
+"被"+this.getClass().getName()+"访问");
}
@Override
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getName()
+"被"+this.getClass().getName()+"访问");
}
}
/**
* 具体访问者
* @author lattice
*
*/
class ConcreteVisitorB extends Visitor{
@Override
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println(concreteElementA.getClass().getName()
+"被"+this.getClass().getName()+"访问");
}
@Override
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getName()
+"被"+this.getClass().getName()+"访问");
}
}
/**
* 定义接收访问者抽象类
* @author lattice
*
*/
abstract class Element{
public abstract void accept(Visitor visitor);
}
/**
* 具体的接收访问者类
* @author lattice
*
*/
class ConcreteElementA extends Element{
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementA(this);
}
public void operationA(){
}
}
class ConcreteElementB extends Element{
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementB(this);
}
public void operationB(){
}
}
/**
* Elenemt容器类,能枚举element元素,并向visitor提供一个高层接口来访问这个容器里面你的元素
* @author lattice
*
*/
class ObjectStructure{
private ArrayList<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 sb:elements){
sb.accept(visitor);
}
}
}