UML
  
  Visitor 为Element中的每一个具体实现类声明一个Visit操作
  
public abstract class Visitor {
    public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
    public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}
  具体访问者1
  
public class ConcreteVisitor1 extends Visitor {
    @Override
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println("ConcreteElementA 的对象被 ConcreteVisitor1 访问");
    }
    @Override
    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
        System.out.println("ConcreteElementB 的对象被 ConcreteVisitor2 访问");
    }
}
  具体访问者2
  
public class ConcreteVisitor2 extends Visitor {
    @Override
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println("ConcreteElementA 的对象被 ConcreteVisitor2 访问");
    }
    @Override
    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
        System.out.println("ConcreteElementB 的对象被 ConcreteVisitor2 访问");
    }
}
  Element类 定义一个accept操作 以访问者为参数
  
public abstract class Element {
    public abstract void accept(Visitor visitor);
}
  具体元素A
  
public class ConcreteElementA extends Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementA(this);
    }
}
  具体元素B
  
public class ConcreteElementB extends Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementB(this);
    }
}
  ObjectStructure提供一个高层的接口以允许访问者访问它的元素
  import java.util.ArrayList;
import java.util.List;
public class ObjectStructure {
    private List<Element> elements = new ArrayList<>();
    public void add(Element element) {
        elements.add(element);
    }
    public void remove(Element element) {
        elements.remove(element);
    }
    public void accept(Visitor visitor) {
        for (Element element : elements) {
            element.accept(visitor);
        }
    }
}
  测试类
  
public class Main {
    public static void main(String[] args) {
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.add(new ConcreteElementA());
        objectStructure.add(new ConcreteElementB());
        Visitor visitor1 = new ConcreteVisitor1();
        Visitor visitor2 = new ConcreteVisitor2();
        objectStructure.accept(visitor1);
        objectStructure.accept(visitor2);
    }
}
  运行结果
  