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

编程-设计模式 24:访问者模式

设计模式 24:访问者模式

定义与目的
  • 定义:访问者模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
  • 目的:该模式的主要目的是分离算法与对象结构,使得可以独立地改变对象结构和作用于这些对象上的操作。
实现示例

假设我们有一个图形编辑器,需要支持不同的图形类型和操作。我们可以使用访问者模式来实现这个需求。

// 抽象元素
interface Shape {void accept(Visitor visitor);
}// 具体元素 - 圆形
class Circle implements Shape {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}// 具体元素 - 矩形
class Rectangle implements Shape {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}// 抽象访问者
interface Visitor {void visit(Circle circle);void visit(Rectangle rectangle);
}// 具体访问者 - 绘制访问者
class DrawVisitor implements Visitor {@Overridepublic void visit(Circle circle) {System.out.println("Drawing circle...");}@Overridepublic void visit(Rectangle rectangle) {System.out.println("Drawing rectangle...");}
}// 具体访问者 - 打印访问者
class PrintVisitor implements Visitor {@Overridepublic void visit(Circle circle) {System.out.println("Printing circle information...");}@Overridepublic void visit(Rectangle rectangle) {System.out.println("Printing rectangle information...");}
}// 对象结构
class ShapeCollection {private List<Shape> shapes = new ArrayList<>();public void addShape(Shape shape) {shapes.add(shape);}public void accept(Visitor visitor) {for (Shape shape : shapes) {shape.accept(visitor);}}
}// 客户端代码
public class Client {public static void main(String[] args) {ShapeCollection collection = new ShapeCollection();collection.addShape(new Circle());collection.addShape(new Rectangle());Visitor drawVisitor = new DrawVisitor();collection.accept(drawVisitor);Visitor printVisitor = new PrintVisitor();collection.accept(printVisitor);}
}
使用场景
  • 当你需要在不改变对象结构中的元素类的前提下定义新的操作时。
  • 当一个对象结构包含多种类型的元素,你想对这些元素执行不同的操作时。
  • 当你需要在对象结构上定义多个操作,并且这些操作都与这些对象有关时。

访问者模式通过分离算法与对象结构,使得可以独立地改变对象结构和作用于这些对象上的操作。这对于需要在不改变对象结构中的元素类的前提下定义新的操作的场景非常有用。

小结

访问者模式是一种常用的行为型模式,它可以帮助你分离算法与对象结构,使得可以独立地改变对象结构和作用于这些对象上的操作。这对于需要在不改变对象结构中的元素类的前提下定义新的操作的场景非常有用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 散点图、折线图 -- 通过javascript实现
  • Spring -- 事务
  • Day23--前后端分离项目中如何使用 Vue.js 和 Axios 加载 WebServlet 生成的验证码图片
  • 三高服务是指什么
  • Docker中新建Python容器运行yolov9
  • Intellij Idea使用技巧
  • C# 闭包详解
  • Traceeshark:Wireshark 的开源插件
  • 结队编程(95%用例)D卷(JavaPythonC++Node.jsC语言)
  • lua匹配MAC地址 正则表达式
  • HarmonyOS第五章:组件抽取、构建函数抽取@Builder、构建函数插槽@BuilderParam
  • springboot+Loki+Loki4j+Grafana搭建轻量级日志系统
  • web自动化6-pytest⑦一些基本情况
  • 基于深度学习的物理仿真
  • CUDA--内存访问越界或无效的索引操作解决办法
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 2017届校招提前批面试回顾
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • co模块的前端实现
  •  D - 粉碎叛乱F - 其他起义
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Linux链接文件
  • pdf文件如何在线转换为jpg图片
  • Redis 中的布隆过滤器
  • Sequelize 中文文档 v4 - Getting started - 入门
  • springMvc学习笔记(2)
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 从零开始在ubuntu上搭建node开发环境
  • 聚类分析——Kmeans
  • 嵌入式文件系统
  • 世界上最简单的无等待算法(getAndIncrement)
  • 算法-插入排序
  • 一道面试题引发的“血案”
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • #if和#ifdef区别
  • (2)(2.10) LTM telemetry
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (力扣题库)跳跃游戏II(c++)
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (学习日记)2024.01.09
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .NET/C# 使窗口永不获得焦点
  • @EnableWebSecurity 注解的用途及适用场景
  • @Import注解详解
  • @JoinTable会自动删除关联表的数据