大话设计模式-访问者模式

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);


    }
}

运行结果

全部评论

相关推荐

shtdbb_:还不错,没有让你做了笔试再挂你
点赞 评论 收藏
分享
vegetable_more_exercise:1-1.5万,没错啊,最少是1人民币,在区间内
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务