访问者模式

**定义:**将算法与其所作用的对象分离开来,封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于其内部各个元素的新操作。

适用场景:

1、一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

2、条件、分支语句的代替者,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

优点:

1、使得算法与对象结构分离,可以灵活地添加新的访问者和元素类型。

2、符合单一职责原则,使得代码更加清晰、易于维护。

缺点:

1、增加新的元素类型会导致访问者的实现类数量增加,系统的复杂度会增加。

2、具体元素暴露了访问者所需的所有细节,增加了对象间的依赖关系。

生活场景中的应用

1、医院的门诊部: 门诊部是一个类似于访问者的对象,它可以访问不同类型的病人对象,例如普通病人、急诊病人、儿科病人等。不同类型的病人对象可以有不同的处理方法,例如看病、输液、检查等。门诊部可以对不同类型的病人对象进行不同的操作,而不需要改变病人对象的类层次结构。

2、电商网站的商品分类可以看作是一个访问者对象,它可以访问不同类型的商品对象,例如数码产品、服装鞋帽、家居用品等。不同类型的商品对象可以有不同的属性和方法,例如价格、尺码、颜色、品牌等。商品分类可以对不同类型的商品对象进行不同的处理方法,例如按照价格进行排序、按照品牌进行筛选等。

源码应用

1)java 7 版本后,Files 类提供了 walkFileTree() 方法,该方法可以很容易的对目录下的所有文件进行遍历,需要 Path、FileVisitor 两个参数。其中,Path 是要遍历文件的路径,FileVisitor 则可以看成一个文件访问器。FileVisitor 提供了递归遍历文件树的支持。

2)Spring 的 BeanDefinitionVisitor:BeanDefinition 为 Spring Bean 的定义信息,在 Spring 解析完配置后,会生成 BeanDefinition 并且记录下来。下次通过 getBean 获取 Bean 的时候,会通过 BeanDefinition 来实例化具体的 Bean 对象。Spring 的 BeanDefinitionVisitor 用来访问 BeanDefinition。抽象元素为 BeanDefinition。对 Bean 的定义信息,比如属性值、构造方法参数或者更具体的实现。具体元素有 RootBeanDefinition、ChildBeanDefinition、GenericBeanDefinition 等等。

因为没有对访问者进行扩展,所以只有一个具体访问者 BeanDefinitionVisitor

访问的具体调用就是visitor.visitBeanDefinition(bd);

相关推荐
人活一口气13 小时前
Spring Boot与AIGC的完美结合:从零搭建智能内容生成平台
java·spring boot·aigc
像我这样帅的人丶你还15 小时前
Java 后端详解(三):全局异常处理与 JPA 数据库映射
java·后端
NE_STOP15 小时前
vibe Coding -- 小项目实战
java
未秃头的程序猿21 小时前
Java 26正式发布!这3个新特性,让代码量直接减半
java·后端·面试
用户2986985301421 小时前
Word 文档文本查找与替换的 Java 实现方案
java·后端
阿哉21 小时前
Nacos 服务发现源码:藏在背后的两套事件机制,90%的人只讲了一半
java
咖啡八杯1 天前
GoF设计模式——命令模式
java·设计模式·架构
AI人工智能_电脑小能手1 天前
【大白话说Java面试题 第125题】【并发篇】第25题:说说 Java 线程的中断机制
java·后端·面试
Java内核笔记1 天前
Spring Security 源码解析(六)无状态 JWT 实践:Session 共享与自定义过滤器
java·后端
荣码1 天前
LangGraph多Agent协作:3个Agent干活比1个强,但我踩了4个坑
java·python