设计模式: 访问者模式

server/2024/10/16 2:31:33/

文章目录

  • 一、介绍
  • 二、模式结构
  • 三、优缺点
    • 1、优点
    • 2、缺点
  • 四、应用场景

一、介绍

Visitor 模式(访问者模式)是一种行为设计模式,它允许在不修改对象结构的前提下,增加作用于一组对象上新的操作。就增加新的操作而言,Visitor 模式把新的操作作为访问者(Visitor)加到对象中,而不是修改那些类的代码。这样,新的操作就可以被应用到所有对象上,而无需修改这些对象的类。

二、模式结构

Visitor 模式主要包含以下几个角色:

  • Visitor(访问者):接口声明了一个或多个访问操作,形成所有的具体元素角色必须实现的接口。
  • ConcreteVisitor(具体访问者):实现 Visitor 接口,也就是实现一个具体的访问操作。
  • Element(元素):声明了一个接受访问者对象的方法(即 accept 方法),该方法通常是一个空实现或只声明了接口。
  • ConcreteElement(具体元素):实现了 Element 接口,存储或定义了一个相关的数据操作,并可以定义一个或多个 accept 操作,以便接受访问者的访问。
  • ObjectStructure(对象结构):是一个元素的集合,且能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。

三、优缺点

1、优点

  • 增加新的操作很容易:只需要增加一个新的访问者类即可。
  • 将有关的行为集中到一个访问者对象中:而不是分散到多个元素类中。
  • 可以绕过通常的继承机制,来访问和修改一个类的内部状态。
  • 使得增加新的元素类变得容易:因为接受操作被集中在一个访问者接口中,所以增加新的元素类不需要修改访问者类的代码。

2、缺点

  • 增加新的元素类很困难:每增加一个新的元素类,都需要在所有的具体访问者类中增加相应的具体操作实现,这违反了“开闭原则”。
  • 破坏封装:访问者可以访问并修改元素的状态,这可能会违反封装原则。

四、应用场景

  • 当一个系统需要对一个对象结构中的对象进行很多不同的操作(这些操作彼此不相关),同时又不希望这些操作的方法定义在元素的类的里面时。
  • 当需要对一个对象结构中的对象进行与对象本身无关的操作时。
  • 当这些操作以后会动态地增加或减少时。

http://www.ppmy.cn/server/102461.html

相关文章

SSH端口转发

文章目录 1. 什么是SSH端口转发2. SSH本地端口转发2.1 两台机器的本地端口转发2.2 三台机器的本地端口转发 3. SSH的远程端口转发4. 总结5. 参考博客 1. 什么是SSH端口转发 SSH端口转发可以看作是一种代理,只要你的电脑和服务器能够建立SSH连接,那么就可…

汽车IVI中控OS Linux driver开发实操(二十四):I2C设备驱动的编写

概述: 在Linux驱动中I2C系统中主要包含以下几个成员: I2C adapter(即I2C适配器,用来控制各种I2C从设备,其驱动需要完成对适配器的完整描述,最主要的工作是需要完成i2c_algorithm结构体。这个结构体包含了此I2C控制器的数据传输具体实现,以及对外上报此设备所支持的功…

Redis5.0单实例数据迁移至分片集群

Redis 5.0 数据迁移至分片集群主要思路是: 如果你的数据全部在 DB0 ,那么按照下边的步骤来操作 1、创建好分片集群 2、需要手动刷新触发全部落盘,备份源rdb或者aof 3、停止原实例的写入(需要你暂停所有相关的服务,…

微信小程序开发构建npm

构建微信小程序中构建npm报错: message: NPM packages not found. Please confirm npm packages which need to build are belong to miniprogramRoot directory. Or you may edit project.config.jsons packNpmManually and packNpmRelationList appid…

OpenCV编译指南-Windows-CMake

前言: 针对opencv的编译容易出现许许多多问题,博主已经将可能遇到的坑几乎都走了一遍,在此记录。一方面作为日后查阅指南,另一方面也给诸位提供便利。谢谢! 1、必要下载准备 CMake:Download CMake visual studio:想必开发者计算机中都有这个软件 OpenCV下载:OpenCV…

机器人等方向学习和研究的目标

核心目标类似: 学习一个知识点用时越来越短,研究一个系统效率越来越高。 目标 没有目标是常态,十分普遍。 但其实,目标也可以很宽泛。 感谢朋友们一直以来的鼓励帮助,倍感荣幸,非常感谢。-CSDN blink-…

Java实现K个排序链表的高效合并:逐一合并、分治法与优先队列详解

Java实现K个排序链表的高效合并:逐一合并、分治法与优先队列详解 在算法和数据结构的学习中,链表是一个非常基础但又极具挑战的数据结构。尤其是当面对合并多个排序链表的问题时,如何在保证效率的前提下实现代码的简洁与高效,往往…

【网络编程】 基于UDP的网络聊天室

前言 将前面的数据结构,多线程,网络的内容加在一起的一个项目,比较综合,在代码部分采用了分文件编译并且写了比较详细的注释(个人觉得)。 ps:希望对大家有用 项目需求: 如果有用户登录&#xf…