UML

Visitor 为Element中的每一个具体实现类声明一个Visit操作

/** * @ClassName: Visitor * @Author: Leo * @Description: Visitor 为Element中的每一个具体实现类声明一个Visit操作 * @Date: 2019/5/28 10:37 */
public abstract class Visitor {
    public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);

    public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}

具体访问者1

/** * @ClassName: ConcreteVisitor1 * @Author: Leo * @Description: 具体访问者1 * @Date: 2019/5/28 10:52 */
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

/** * @ClassName: ConcreteVisitor2 * @Author: Leo * @Description: 具体访问者2 * @Date: 2019/5/28 10:52 */
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操作 以访问者为参数

/** * @ClassName: Element * @Author: Leo * @Description: Element类 定义一个accept操作 以访问者为参数 * @Date: 2019/5/28 10:49 */
public abstract class Element {
    public abstract void accept(Visitor visitor);
}

具体元素A

/** * @ClassName: ConcreteElementA * @Author: Leo * @Description: 具体元素A * @Date: 2019/5/28 10:50 */
public class ConcreteElementA extends Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementA(this);
    }
}

具体元素B

/** * @ClassName: ConcreteElementB * @Author: Leo * @Description: 具体元素B * @Date: 2019/5/28 10:50 */
public class ConcreteElementB extends Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementB(this);
    }
}

ObjectStructure提供一个高层的接口以允许访问者访问它的元素

import java.util.ArrayList;
import java.util.List;

/** * @ClassName: ObjectStructure * @Author: Leo * @Description: ObjectStructure提供一个高层的接口以允许访问者访问它的元素 * @Date: 2019/5/28 10:57 */
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);
        }
    }
}

测试类

/** * @ClassName: Main * @Author: Leo * @Description: 测试类 * @Date: 2019/5/28 10:24 */
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);


    }
}

运行结果