访问者模式(Visitor Pattern)

访问者模式(Visitor Pattern)

定义

访问者模式(Visitor Pattern)

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

该模式的主要思想是将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使得可以在不改变数据结构的前提下添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。

属于行为型模式。


适用场景

  1. 数据结构稳定,作用于数据结构的操作经常发生变化的场景;
  2. 需要数据结构与数据操作分离的场景;
  3. 需要对不同数据类型(元素)进行操作,而不使用分支判断具体类型的场景。

标准示例

  • Visitor(抽象访问者):定义一个访问具体元素的接口,该接口内部包含了对所有具体元素的访问方法。
  • ConcreteVisitor(具体访问者):实现Visitor接口,针对特定类型的元素执行具体访问操作。
  • Element(抽象元素):定义一个接受访问操作的接口,通常包含一个accept()方法,该方法接收一个访问者对象作为参数。
  • ConcreteElement(具体元素):实现了Element接口,存储了实际的数据,并提供接受访问者访问的方法实现。
  • ObjectStructure(对象结构):管理元素的集合,通常包含add、remove等方法以及一个遍历所有元素的accept()方法,该方法接收一个访问者对象作为参数,并遍历所有元素,让每个元素接受访问者的访问。

    代码:
java 复制代码
public interface IVisitor {
    void visit(ConcreteElementA element);
    void visit(ConcreteElementB element);
}
java 复制代码
public class ConcreteVisitorA implements IVisitor {

    public void visit(ConcreteElementA element) {
        String result = element.operationA();
        System.out.println( element.getClass().getSimpleName() + " : " + result);
    }

    public void visit(ConcreteElementB element) {
        int result = element.operationB();
        System.out.println( element.getClass().getSimpleName() + ": " + result);
    }
}
java 复制代码
public class ConcreteVisitorB implements IVisitor {

    public void visit(ConcreteElementA element) {
        String result = element.operationA();
        System.out.println(element.getClass().getSimpleName() + ": " + result);
    }
    public void visit(ConcreteElementB element) {
        int result = element.operationB();
        System.out.println( element.getClass().getSimpleName() + ": " + result);
    }
}
java 复制代码
public interface IElement {
    void accept(IVisitor visitor);
}
java 复制代码
public class ConcreteElementA implements IElement {

    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }

    public String operationA() {
        return this.getClass().getSimpleName();
    }

}
java 复制代码
public class ConcreteElementB implements IElement {

    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }

    public int operationB() {
        return new Random().nextInt(10);
    }
}
java 复制代码
public class ObjectStructure {
    private List<IElement> list = new ArrayList<IElement>();

    {
        this.list.add(new ConcreteElementA());
        this.list.add(new ConcreteElementB());
    }

    public void accept(IVisitor visitor) {
        for (IElement element : this.list) {
            element.accept(visitor);
        }
    }
}
java 复制代码
public class Test {

    public static void main(String[] args) {
        ObjectStructure objectStructure = new ObjectStructure();	
        IVisitor visitorA = new ConcreteVisitorA();
        objectStructure.accept(visitorA);
        System.out.println("***************************************");
        IVisitor visitorB = new ConcreteVisitorB();
        objectStructure.accept(visitorB);
    }

}

输出结果:

shell 复制代码
ConcreteElementA: ConcreteElementA
ConcreteElementB: 5
***************************************
ConcreteElementA: ConcreteElementA
ConcreteElementB: 4

以上就是访问者模式全部内容,感谢阅读!

相关推荐
Lhappy嘻嘻3 小时前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
伊玛目的门徒3 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
懒鸟一枚6 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我123458 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑8 小时前
Sentinel安装
java·后端·微服务
凤凰院凶涛QAQ9 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
掘金_答案10 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
猿与禅11 小时前
CosId 分布式 ID 生成器完全教程:从架构原理到生产落地
java·shardingsphere·雪花算法·分布式id·高性能·cosid·号段模式
MindUp11 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
NG47711 小时前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程