访问者模式

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

适用场景:

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

相关推荐
木井巳19 小时前
【动态规划: 线性dp】解码方法
java·算法·leetcode·动态规划·推荐算法
缓慢更新1 天前
审批的加签与会签:多人意见怎么合
android·java·数据库·低代码·rxjava
yuniko-n1 天前
【JUC】volatile 非原子性深入解析
java
sun_weitao1 天前
极简版 MCP 工具实现方案
java·linux·服务器
金銀銅鐵1 天前
[Java] 展示增删元素时 LinkedList 的内部变化
java·后端·ai编程
布吉岛的石头1 天前
Java 程序员第 50 阶段3:数据工程:预训练语料清洗与去重
java·开发语言·人工智能·深度学习·transformer
大文说跨境1 天前
防关联浏览器的指纹覆盖到什么程度:六类参数的实测与自检方法
java·指纹浏览器·tiktok运营
Carol06301 天前
上肢及肩肘关节
java·服务器·数据库
yliucherish1 天前
Log4Shell 复现实录:我读 OpenJDK 源码,发现两道防线的默认值竟然相反
java
维拉德1 天前
Java新人第一次接打标需求:从抓包找接口到客户端展示
java