网站首页 > 博客文章 正文
访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern):属于类的行为模式。表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式UML图
Java
访问者模式涉及的角色
抽象访问者(Visitor)角色:为该对象结构中 ConcreteElement 的每一个类声明一个 visite 操作。具体访问者(ConcreteVisitor)角色:实现每个由 visitor 声明的操作。每个操作实现算法的一部分,而该算法片段乃是对应于结构中的对象的类。抽象元素(Element)角色:定义一个 accept 操作,它以一个访问者为参数。具体元素(ConcreteElement)角色:实现了抽象元素所规定的接受操作。结构对象(ObjectStructure)角色:有如下的责任,可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素;如果需要,可以设计成一个复合对象或者一个聚集,如List或Set。
示例代码
抽象访问者类 Visitor
Java
具体访问者1类 ConcreteVisitor1
Java
具体访问者2类 ConcreteVisitor2
Java
抽象元素类 Element
Java
具体元素类A ConcreteElementA
Java
具体元素类B ConcreteElementB
Java
结构对象类 ObjectStructure
Java
客户端测试类 VisitorPatternTest
Java
执行过程
客户端创建一个结构对象 ObjectStructure,将一个新的 ConcreteElementA 和一个新的 ConcreteElementB传入。
客户端创建一个 ConcreteVisitor1 和一个 ConcreteVisitor2 对象,并将对应的两个对象传入结构对象中。
客户端调用结构对象聚集管理方法,将 ConcreteElementA 和 ConcreteElementB 节点加入到结构对象中去。
客户端调用结构对象的接受方法 accept(),启动访问过程。
ConcreteElementA 对象的接受方法 accept() 被调用,并将 ConcreteVisitor1 对象本身传入;
ConcreteElementA 对象反过来调用 ConcreteVisitor1 对象的访问方法,并将 ConcreteElementA 对象本身传入;
ConcreteVisitor1 对象调用 输出对应信息。
ConcreteElementB 与 ConcreteVisitor2 执行过程类似。
双重分派
宗量:一个方法所属的对象叫做方法的接收者,方法的接收者与方法的参数统称做方法的宗量。双重分派:一个方法根据两个宗量的类型来决定执行不同的代码,这就是“双重分派”。
上面的 5 6 7 8 步骤就是一个双重分派过程。
访问者模式的优点
好的扩展性:能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。好的复用性:可以通过访问者来定义整个对象结构通用的功能,从而提高复用程度。分离无关行为: 可以通过访问者来分离无关的行为,把相关的行为封装在一起,构成一个访问者,这样每一个访问者的功能都比较单一。
访问者模式的缺点
对象结构变化很困难:不适用于对象结构中的类经常变化的情况,因为对象结构发生了改变,访问者的接口和访问者的实现都要发生相应的改变,代价太高。破坏封装:访问者模式通常需要对象结构开放内部数据给访问者和ObjectStructrue,这破坏了对象的封装性。
Java学习资料获取(复制下段连接至浏览器即可)
data:text/html;charset=UTF-8;base64,5p625p6E5biI5a2m5Lmg6LWE5paZ5YWN6LS56aKG5Y+W6K+35Yqg5omj5omj5Y+35pivMTAxODkyNTc4MA==
喜欢文章的可以关注小编 小编每天都会给大家更新哦
猜你喜欢
- 2024-10-01 设计模式——备忘录模式(备忘录界面设计)
- 2024-10-01 设计模式 之 行为型模式(行为型设计模式特点)
- 2024-10-01 Go语言设计模式-访问者(go语言有设计模式吗)
- 2024-10-01 Spring Boot 实战:运用访问者模式灵活扩展订单处理逻辑
- 2024-10-01 visitor pattern 访问者模式(访问者模式工作原理)
- 2024-10-01 Aha!设计模式(105)-访问者模式(1)
- 2024-10-01 GOF设计模式(命令模式,访问者模式,迭代器模式,观察者模式)
- 2024-10-01 设计模式第2招第9式之解释器模式(解释器原理)
- 2024-10-01 设计模式第2招第1式之观察者模式(观察者设计模式的优点)
- 2024-10-01 「编程设计」访问者(Visitor)模式-补丁式为原体系增加新功能
你 发表评论:
欢迎- 07-07Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- 07-07Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- 07-07Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- 07-07Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- 07-07IT运维必会的30个工具(it运维工具软件)
- 07-07开源项目有你需要的吗?(开源项目什么意思)
- 07-07自动化测试早就跑起来了,为什么测试管理还像在走路?
- 07-07Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- 最近发表
-
- Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- IT运维必会的30个工具(it运维工具软件)
- 开源项目有你需要的吗?(开源项目什么意思)
- 自动化测试早就跑起来了,为什么测试管理还像在走路?
- Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- Cursor 太贵?这套「Cline+OpenRouter+Deepseek+Trae」组合拳更香
- 为什么没人真的用好RAG,坑都在哪里? 谈谈RAG技术架构的演进方向
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)