设计模式之访问者模式讲解

概念:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新操作。

  • 抽象访问者:声明一个或多个访问操作,定义访问者可以访问哪些元素。
  • 具体访问者:实现抽象访问者的所有操作。
  • 抽象元素:声明一个接受操作,接受一个访问者对象。
  • 具体元素:实现抽象元素中的接受操作。实际上就是在该方法中去调用对应的visit方法。
  • 结构对象:遍历结构中的所有元素,并对元素进行访问操作。

public interface Visitor {
    void visit(ElementA elementA);
    void visit(ElementB elementB);
}

public class ConcreteVisitor implements Visitor {
    @Override
    public void visit(ElementA elementA) {
        System.out.println("访问 ElementA: " + elementA);
        // 针对ElementA的具体操作
    }
    @Override
    public void visit(ElementB elementB) {
        System.out.println("访问 ElementB: " + elementB);
        // 针对ElementB的具体操作
    }
}

public interface Element {
    void accept(Visitor visitor);
}

public class ElementA implements Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

public class ElementB implements Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

public class ObjectStructure {
    private List<Element> elements = new ArrayList<>();
    public void attach(Element element) {
        elements.add(element);
    }
    public void detach(Element element) {
        elements.remove(element);
    }
    public void accept(Visitor visitor) {
        for (Element element : elements) {
            element.accept(visitor);
        }
    }
}

public class Demo {
    public static void main(String[] args) {
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.attach(new ElementA());
        objectStructure.attach(new ElementB());
        objectStructure.attach(new ElementA());
        objectStructure.attach(new ElementA());
        objectStructure.attach(new ElementB());
        objectStructure.attach(new ElementB());
        Visitor visitor = new ConcreteVisitor();
        // 访问所有的元素
        objectStructure.accept(visitor);
    }
}

如果大家需要视频版本的讲解,欢迎大家关注我的B站:

【天哥不爱学习的个人空间-哔哩哔哩】 https://b23.tv/HxwqjXl

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值