访问者模式

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

适用场景:

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

相关推荐
wm104312 分钟前
java web springboot
java·spring boot·后端
smile-yan13 分钟前
Provides transitive vulnerable dependency maven 提示依赖存在漏洞问题的解决方法
java·maven
老马啸西风14 分钟前
NLP 中文拼写检测纠正论文-01-介绍了SIGHAN 2015 包括任务描述,数据准备, 绩效指标和评估结果
java
Earnest~18 分钟前
Maven极简安装&配置-241223
java·maven
皮蛋很白20 分钟前
Maven 环境变量 MAVEN_HOME 和 M2_HOME 区别以及 IDEA 修改 Maven repository 路径全局
java·maven·intellij-idea
青年有志22 分钟前
JavaWeb(一) | 基本概念(web服务器、Tomcat、HTTP、Maven)、Servlet 简介
java·web
上海研博数据26 分钟前
flink+kafka实现流数据处理学习
java
KpLn_HJL28 分钟前
leetcode - 2139. Minimum Moves to Reach Target Score
java·数据结构·leetcode
小扳2 小时前
微服务篇-深入了解 MinIO 文件服务器(你还在使用阿里云 0SS 对象存储图片服务?教你使用 MinIO 文件服务器:实现从部署到具体使用)
java·服务器·分布式·微服务·云原生·架构
龙少95432 小时前
【深入理解@EnableCaching】
java·后端·spring