当前位置: 首页 > news >正文

访问者模式(Visitor Pattern)

访问者模式(Visitor Pattern)

定义

访问者模式(Visitor Pattern)
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

该模式的主要思想是将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使得可以在不改变数据结构的前提下添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。

属于行为型模式。


适用场景

  1. 数据结构稳定,作用于数据结构的操作经常发生变化的场景;
  2. 需要数据结构与数据操作分离的场景;
  3. 需要对不同数据类型(元素)进行操作,而不使用分支判断具体类型的场景。

标准示例

  • Visitor(抽象访问者):定义一个访问具体元素的接口,该接口内部包含了对所有具体元素的访问方法。
  • ConcreteVisitor(具体访问者):实现Visitor接口,针对特定类型的元素执行具体访问操作。
  • Element(抽象元素):定义一个接受访问操作的接口,通常包含一个accept()方法,该方法接收一个访问者对象作为参数。
  • ConcreteElement(具体元素):实现了Element接口,存储了实际的数据,并提供接受访问者访问的方法实现。
  • ObjectStructure(对象结构):管理元素的集合,通常包含add、remove等方法以及一个遍历所有元素的accept()方法,该方法接收一个访问者对象作为参数,并遍历所有元素,让每个元素接受访问者的访问。
    在这里插入图片描述
    代码:
public interface IVisitor {void visit(ConcreteElementA element);void visit(ConcreteElementB element);
}
public class ConcreteVisitorA implements IVisitor {public void visit(ConcreteElementA element) {String result = element.operationA();System.out.println( element.getClass().getSimpleName() + " : " + result);}public void visit(ConcreteElementB element) {int result = element.operationB();System.out.println( element.getClass().getSimpleName() + ": " + result);}
}
public class ConcreteVisitorB implements IVisitor {public void visit(ConcreteElementA element) {String result = element.operationA();System.out.println(element.getClass().getSimpleName() + ": " + result);}public void visit(ConcreteElementB element) {int result = element.operationB();System.out.println( element.getClass().getSimpleName() + ": " + result);}
}
public interface IElement {void accept(IVisitor visitor);
}
public class ConcreteElementA implements IElement {public void accept(IVisitor visitor) {visitor.visit(this);}public String operationA() {return this.getClass().getSimpleName();}}
public class ConcreteElementB implements IElement {public void accept(IVisitor visitor) {visitor.visit(this);}public int operationB() {return new Random().nextInt(10);}
}
public class ObjectStructure {private List<IElement> list = new ArrayList<IElement>();{this.list.add(new ConcreteElementA());this.list.add(new ConcreteElementB());}public void accept(IVisitor visitor) {for (IElement element : this.list) {element.accept(visitor);}}
}
public class Test {public static void main(String[] args) {ObjectStructure objectStructure = new ObjectStructure();	IVisitor visitorA = new ConcreteVisitorA();objectStructure.accept(visitorA);System.out.println("***************************************");IVisitor visitorB = new ConcreteVisitorB();objectStructure.accept(visitorB);}}

输出结果:

ConcreteElementA: ConcreteElementA
ConcreteElementB: 5
***************************************
ConcreteElementA: ConcreteElementA
ConcreteElementB: 4

以上就是访问者模式全部内容,感谢阅读!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 监控房价和挂牌数量的工具-以成都房价为例
  • 群晖 搭建alist 记录
  • AWS无服务器 应用程序开发—第十八章 AWS EventBridge
  • AI绘画Stable Diffusion 零基础入门 —AI 绘画原理与工具介绍,万字解析AI绘画的使用教程
  • <Rust>egui部件学习:如何在窗口及部件显示中文字符?
  • 谷歌C语言编码规范详解
  • AI安全入门-人工智能数据与模型安全
  • 免费长效IP在业务场景中的深度应用解析
  • 移掉 K 位数字
  • RK3568 安卓12 EC20模块NOCONN没有ip的问题(已解决)
  • elasticsearch过滤器filter:原理及使用
  • [Linux]基本指令(二)
  • 【C语言】深入解析希尔排序
  • Spring Boot项目的控制器貌似只能get不能post问题
  • Scala之基础面向对象编程
  • 自己简单写的 事件订阅机制
  • [nginx文档翻译系列] 控制nginx
  • 10个确保微服务与容器安全的最佳实践
  • Django 博客开发教程 16 - 统计文章阅读量
  • JavaScript 一些 DOM 的知识点
  • javascript面向对象之创建对象
  • jQuery(一)
  • Js基础——数据类型之Null和Undefined
  • Redux 中间件分析
  • 反思总结然后整装待发
  • 分享一份非常强势的Android面试题
  • 关于字符编码你应该知道的事情
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 你真的知道 == 和 equals 的区别吗?
  • 前端面试题总结
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 使用Swoole加速Laravel(正式环境中)
  • 使用权重正则化较少模型过拟合
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 延迟脚本的方式
  • 在Mac OS X上安装 Ruby运行环境
  • 进程与线程(三)——进程/线程间通信
  • ​flutter 代码混淆
  • ​如何使用QGIS制作三维建筑
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (分布式缓存)Redis分片集群
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (六)激光线扫描-三维重建
  • (十三)MipMap
  • (未解决)macOS matplotlib 中文是方框
  • (一)插入排序
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)项目管理杂谈-我所期望的新人
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .Net Remoting常用部署结构
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET国产化改造探索(一)、VMware安装银河麒麟