设计模式- 访问者模式(Visitor Pattern)结构|原理|优缺点|场景|示例

ops/2024/10/19 3:27:56/

                                     设计模式(分类)        设计模式(六大原则)   

    创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

    结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

    行为型(11种)      策略模式        模板方法模式        观察者模式        迭代器模式     责任链模式     命令模式    备忘录模式          状态模式         访问者模式        中介者模式 


访问者模式(Visitor Pattern)是一种行为设计模式,它表示一个作用于某对象结构中的各个元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于需要对一个对象结构中的对象进行很多不同类型的运算,而且施加运算的对象又不希望知道这些运算的具体实现的情况。

结构: 访问者模式的主要参与者有:

  1. Visitor(访问者):声明一个访问操作接口,该接口中的每个操作元素对应一个需要访问的对象类的元素。具体访问者则实现了这些操作。
  2. Element(元素):定义一个接受访问者的方法,一般称为accept(),它以一个访问者作为参数。
  3. ConcreteElement(具体元素):实现了Element中的accept()方法,通常会调用访问者的访问方法来完成对一个元素的操作。
  4. ObjectStructure(对象结构):能够枚举它的元素,提供一个接口让访问者可以访问它的元素。

原理: 

        访问者模式通过双分派机制实现。首先,客户端代码将 ConcreteElement 对象传递给访问者对象;然后,访问者对象根据 ConcreteElement 的类型来决定调用哪个具体的操作方法。这样,增加新的元素类型或新的访问操作都很方便,只需增加新的元素类和新的访问者类即可,原有的代码无需修改。

优缺点:

优点:

  • 扩展性好:增加新的操作变得容易,只需要增加新的访问者类即可,符合开闭原则。
  • 封装性好:将数据结构和操作分离,使得操作集合可独立变化。

缺点:

  • 违反了单一职责原则,将数据结构和算法耦合到了一起。
  • 对象结构变化困难:若要增加新的元素类,需要修改访问者接口及所有具体访问者类,违反了开闭原则。
  • 实现较为复杂,不易理解。

应用场景:

  • 需要对对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类。
  • 当需要对一个组合结构中的对象进行很多不同类型的操作,而操作算法又彼此独立时。

 代码示例(以Java为例)

// 访问者接口
interface Visitor {void visit(TextElement element);void visit(ImageElement element);void visit(TableElement element);
}// 具体访问者:统计字符数
class CharacterCounter implements Visitor {int count = 0;@Overridepublic void visit(TextElement element) {count += element.getText().length();}// 图片和表格访问不做处理@Overridepublic void visit(ImageElement element) {}@Overridepublic void visit(TableElement element) {}// 获取统计结果public int getCount() { return count; }
}// 具体访问者:统计图片数量
class ImageCounter implements Visitor {int count = 0;@Overridepublic void visit(TextElement element) {}@Overridepublic void visit(ImageElement element) { count++; }@Overridepublic void visit(TableElement element) {}// 获取统计结果public int getCount() { return count; }
}// 元素接口
interface Element {void accept(Visitor visitor);
}// 具体元素:文本
class TextElement implements Element {private String text;public TextElement(String text) { this.text = text; }public String getText() { return text; }@Overridepublic void accept(Visitor visitor) { visitor.visit(this); }
}// 其他具体元素:图片、表格的定义省略...// 对象结构:文档
class Document {private List<Element> elements;public Document() { elements = new ArrayList<>(); }public void add(Element element) { elements.add(element); }public void print(Visitor visitor) {for (Element e : elements) {e.accept(visitor);}}
}// 示例使用
public class VisitorPatternDemo {public static void main(String[] args) {Document doc = new Document();doc.add(new TextElement("Hello, World!"));doc.add(new ImageElement());doc.add(new TableElement());Visitor counter1 = new CharacterCounter();doc.print(counter1);System.out.println("Total characters: " + counter1.getCount());Visitor counter2 = new ImageCounter();doc.print(counter2);System.out.println("Total images: " + counter2.getCount());}
}

在这个例子中,Document类代表对象结构,它包含不同类型的Element(如TextElementImageElementTableElement等)。通过访问者模式,我们能够为这些不同类型的元素定义新的操作(如统计字符数、图片数),而无需修改元素本身的类。


http://www.ppmy.cn/ops/24398.html

相关文章

3分钟了解拍摄VR全景需要哪些硬件

VR全景图片是一张水平方向360度&#xff0c;垂直方向180度&#xff0c; 图片尺寸宽高比为2:1的图片。 通过720yun APP或720yun官网上传生成全景H5页面&#xff0c;即可360度全方位观看画面中的景象。 拍摄VR全景有很多方法&#xff0c;下面介绍用单反相机、全景相机、智能手机…

Python爬虫--Scrapy框架安装

Scrapy框架安装 &#xff0c; Scrapy 是 Python 领域专业的爬虫开发框架&#xff0c;已经完成爬虫程序的大部分通用工具 它使用了 Twisted 异步网络库来处理网络通讯。整体架构大致如下 第一步&#xff1a;挂小灰机或者将要安装的文件下载到本地 Scrapy 框架安装踩坑中 为什…

IDEA 创建Servlet-HelloWorldServlet

servlet 1.创建空项目2.配置web项目3.配置Tomcat4.加载Tomcat包5.创建HelloWorldServlet类6.配置web.xml7.运行get与post请求 1.创建空项目 2.配置web项目 3.配置Tomcat 4.加载Tomcat包 5.创建HelloWorldServlet类 public class controller extends HttpServlet {Override//get…

Double 4 VR智能互动系统在法律法庭上的模拟演练教学

随着科技的不断发展&#xff0c;虚拟现实技术&#xff08;VR&#xff09;在各个领域的应用也越来越广泛。而在法律领域&#xff0c;VR技术也被用于模拟法庭审判&#xff0c;让学习者能够在虚拟环境中亲身体验法庭审判的全过程&#xff0c;从而提高其法律意识和法律素养。 为了…

深入理解Python多进程:从基础到实战

title: 深入理解Python多进程&#xff1a;从基础到实战 date: 2024/4/29 20:49:41 updated: 2024/4/29 20:49:41 categories: 后端开发 tags: 并发编程多进程管理错误处理资源调度性能优化异步编程Python并发库 引言 在Python编程中&#xff0c;多进程是一种重要的并发编程…

网盘——进入文件夹

本文主要讲解网盘的文件操作中进入文件夹的部分&#xff0c;具体实现步骤如下&#xff1a; 1、具体步骤如下&#xff1a; A、客户端发送进入文件夹的请求&#xff08;该请求包含目录信息以及要进入的文件夹名字&#xff09; B、服务器收到该请求之后&#xff0c;服务器首先判…

JAVA内部类

内部类 Java内部类&#xff08;Inner Class&#xff09;是定义在另一个类&#xff08;外部类&#xff09;内部的一个类。这种嵌套类的定义允许更紧密的代码组织和更高的封装性。内部类可以访问其外部类的所有成员&#xff0c;包括私有成员&#xff0c;反之则不然。内部类可以有…

前端实现导入Excel进行数据展示、导出

需求 一个 excel 文档 需要对文档里面的数据进行筛选拆分重组 由于数据量巨大 后端又抽不出来手 于是使用纯前端解决方案 解决思路 前端导入excel 把 excel 的数据解析为 json 格式 对数据进行相应操作后 重新导出为新 excel 虽笨但有效 第一步 导入excel 该方案需引…