访问者模式

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

适用场景:

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

相关推荐
张紫娃1 分钟前
idea 常用快捷键
java·ide·intellij-idea
兮动人5 分钟前
Java应用全链路故障排查实战指南:从系统资源到JVM深度诊断
java·开发语言·jvm
风流 少年12 分钟前
Cursor创建Spring Boot项目
java·spring boot·后端
wáng bēn20 分钟前
【java17】使用 Word 模板导出带替换符、动态表格和二维码的文档
java·word·itextpdf
全栈凯哥1 小时前
16.Spring Boot 国际化完全指南
java·spring boot·后端
M1A12 小时前
Java集合框架深度解析:LinkedList vs ArrayList 的对决
java·后端
Top`2 小时前
Java 泛型 (Generics)
java·开发语言·windows
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
如何使用Java WebSocket API实现客户端和服务器端的通信?
java·开发语言·websocket
是小崔啊2 小时前
tomcat源码02 - 理解Tomcat架构设计
java·tomcat
没有bug.的程序员3 小时前
JAVA面试宝典 -《安全攻防:从 SQL 注入到 JWT 鉴权》
java·安全·面试