设计模式行为型——访问者模式

目录

访问者模式的定义

访问者模式的实现

访问者模式角色

访问者模式类图

访问者模式举例

访问者模式代码实现

访问者模式的特点

优点

缺点

使用场景

注意事项

实际应用


访问者模式的定义

        访问者模式(Visitor Pattern)属于行为型设计模式,它允许在不修改现有对象结构的前提下,定义对这些对象执行操作的新操作。访问者模式将数据结构和操作分离,使得操作可以独立变化。

        访问者模式基本思想是,针对系统中拥有固定类型数的对象结构(元素),在其内提供一个 accept()方法来接受访问者对象的访问。不同的访问者对同一个元素的访问内容是不同,使得相同的元素集合可以产生不同的数据结果。

访问者模式的实现

访问者模式角色

  1. 抽象访问者角色(Visitor):接口或者抽象类,为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。
  2. 具体访问者角色(ConcreteVisitor):实现Visitor声明的接口,是每个操作实现的部分。
  3. 抽象元素角色(Element):接口或者抽象类,该类定义了一个接受访问者访问的方法 accept()方法,表示所有元素类型都支持被访问者访问。
  4. 具体元素角色(ConcreteElement):具体元素类型,实现了抽象元素(Element)所定义的接受操作接口。
  5. 结构对象角色(ObjectStructure):该类内部维护了元素集合,并提供方法接受访问者对该集合所有元素进行操作。它具备以下特性:能枚举它的元素;可以提供一个高层接口以允许访问者访问它的元素;如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。

访问者模式类图

访问者模式代码实现

抽象访问者角色

package com.common.demo.pattern.visitor;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 抽象访问者角色 * @date 2023/08/09 21:48:44*/
public interface ComputerPartVisitor {void visit(ComputerHost computerHost);void visit(Mouse mouse);void visit(Keyboard keyboard);void visit(Monitor monitor);
}

具体访问者角色

package com.common.demo.pattern.visitor;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 实体访问者角色 计算机部件显示访问者* @date 2023/08/09 21:54:19*/
public class ComputerPartDisplayVisitor implements ComputerPartVisitor{@Overridepublic void visit(ComputerHost computerHost) {System.out.println("Displaying Computer.");}@Overridepublic void visit(Mouse mouse) {System.out.println("Displaying Mouse.");}@Overridepublic void visit(Keyboard keyboard) {System.out.println("Displaying Keyboard.");}@Overridepublic void visit(Monitor monitor) {System.out.println("Displaying Monitor.");}
}

抽象元素角色

package com.common.demo.pattern.visitor;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 抽象元素角色 计算机组成部分* @date 2023/08/09 21:47:18*/
public interface ComputerPart {void accept(ComputerPartVisitor computerPartVisitor);
}

具体元素角色

package com.common.demo.pattern.visitor;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体元素角色 电脑主机* @date 2023/08/09 21:50:15*/
public class ComputerHost implements ComputerPart {@Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);}
}
package com.common.demo.pattern.visitor;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体元素角色 键盘* @date 2023/08/09 21:50:15*/
public class Keyboard implements ComputerPart {@Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);}
}
package com.common.demo.pattern.visitor;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体元素角色 显示器* @date 2023/08/09 21:50:15*/
public class Monitor implements ComputerPart {@Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);}
}
package com.common.demo.pattern.visitor;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体元素角色 鼠标* @date 2023/08/09 21:50:15*/
public class Mouse implements ComputerPart {@Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);}
}

结构对象角色

package com.common.demo.pattern.visitor;import java.util.ArrayList;
import java.util.List;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 结构对象角色 电脑* @date 2023/08/09 21:50:15*/
public class Computer{private List<ComputerPart> employeeList = new ArrayList<>();{employeeList.add(new ComputerHost());employeeList.add(new Keyboard());employeeList.add(new Monitor());employeeList.add(new Mouse());}//遍历public void showReport(ComputerPartVisitor visitor){for (ComputerPart computerPart : this.employeeList) {computerPart.accept(visitor);}}
}

测试代码

package com.common.demo.pattern.visitor;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 测试代码* @date 2023/08/09 22:00:44*/
public class Test {public static void main(String[] args) {Computer computer = new Computer();computer.showReport(new ComputerPartDisplayVisitor());}}

测试截图

访问者模式的特点

优点

  1. 增加新的操作更容易:通过访问者模式,可以在不修改现有对象结构的情况下增加新的操作,符合开闭原则。
  2. 将相关操作集中到一个访问者类中:访问者模式将相关操作封装在一个访问者类中,使得代码更加结构化和清晰。
  3. 扩展性强:由于访问者模式将数据结构和操作解耦,因此可以方便地添加新的数据结构和操作,扩展性强。
  4. 解耦性:解耦了数据结构与数据操作,使得操作集合可以独立变化。

缺点

  1. 增加新的元素类困难:当需要增加新的元素类时,需要同时修改访问者接口和所有的具体访问者类,可能导致修改的范围较大。
  2. 违反了单一职责原则:访问者模式将相关操作集中到访问者类中,可能导致该类承担过多的责任,违反单一职责原则。
  3. 违背依赖倒置原则:访问者角色依赖的是具体元素类型,而不是抽象。

使用场景

  1. 当需要对一组对象执行多种不同且不相关的操作时,可以考虑使用访问者模式。
  2. 数据结构稳定,数据结构与数据操作分离,作用于数据结构的操作经常变化的场景。

注意事项

  1. 对象结构稳定:在使用访问者模式时,对象结构应该是相对稳定的,避免频繁修改对象结构,否则会导致访问者接口和具体访问者类的修改范围较大。
  2. 具体元素类的扩展:如果需要频繁添加新的元素类,可能会增加访问者接口和具体访问者类的修改工作量,需要谨慎设计。

实际应用

  1. 编译器的语法树分析:编译器可以使用访问者模式来遍历语法树,对不同类型的节点执行不同的操作。
  2. 数据结构的序列化:对于复杂的数据结构,可以使用访问者模式来实现序列化操作,将对象转换为特定格式的字符串或字节流。

更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/67354.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法与数据结构(二十四)最优子结构原理和 dp 数组遍历方向

注&#xff1a;此文只在个人总结 labuladong 动态规划框架&#xff0c;仅限于学习交流&#xff0c;版权归原作者所有&#xff1b; 本文是两年前发的 动态规划答疑篇open in new window 的修订版&#xff0c;根据我的不断学习总结以及读者的评论反馈&#xff0c;我给扩展了更多…

武汉地铁19号线完成5G专网全覆盖,现场测试下行速率超千兆!

近日&#xff0c;极目新闻记者从中国移动湖北公司获悉&#xff0c;随着武汉地铁19号线全线隧道正式贯通&#xff0c;湖北移动目前已完成新月溪公园至鼓架山站5G网络覆盖&#xff0c;轨行区5G专网全覆盖&#xff0c;并成功进行试车验证&#xff0c;19号线成为国内首条全线实现5G…

jmeter中用户参数和用户定义的变量的区别

如果使用jmeter做过参数化的人都知道&#xff0c;参数化的方式有多种&#xff0c;其中一种就是使用用户定义的变量&#xff0c;还有一种是使用用户参数。那么&#xff0c;这两个有什么异同呢&#xff1f; 一、先说相同的点&#xff1a; 1、都可以参数化&#xff0c;以供sample…

大数据:什么是数据分析及环境搭建

一、什么是数据分析 当今世界对信息技术的依赖程度在不断加深&#xff0c;每天都会有大量的数据产生&#xff0c;我们经常会感到数据越来越多&#xff0c;但是要从中发现有价值的信息却越来越难。这里所说的信息&#xff0c;可以理解为对数据集处理之后的结果&#xff0c;是从…

数据结构算法--2 冒泡排序,选择排序,插入排序

基础排序算法 冒泡排序 思想就是将相邻元素两两比较&#xff0c;当一个元素大于右侧相邻元素时&#xff0c;交换他们的位置&#xff0c;小于右侧元素时&#xff0c;位置不变&#xff0c;最终序列中的最大元素&#xff0c;像气泡一样&#xff0c;到了最右侧。 这时冒泡排序第一…

SDK是什么,SDK和API有什么区别

SDK&#xff08;Software Development Kit&#xff09;是一种开发工具包&#xff0c;通常由软件开发公司或平台提供&#xff0c;用于帮助开发人员构建、测试和集成特定平台或软件的应用程序。SDK 包含一系列的库、工具、示例代码和文档&#xff0c;旨在简化开发过程并提供所需的…

ESD实时监测报警系统的主要功能

ESD&#xff08;Electrostatic Discharge&#xff09;实时监测报警系统是一种用于检测和预防静电放电的系统。静电放电是指在两个或多个物体之间由于电荷失衡而引起的突然放电现象&#xff0c;可能会对电子设备、化学品等敏感物体造成损害。 ESD实时监测报警系统的主要功能是通…

div输入框的文字超过指定行数用省略号表示css

实现效果&#xff1a;超过四行用省略号表示 实现方法&#xff1a; .text{overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 4; // 自定义行数-webkit-box-orient: vertical; }

Flink源码之JobMaster启动流程

Flink中Graph转换流程如下&#xff1a; Flink Job提交时各种类型Graph转换流程中&#xff0c;JobGraph是Client端形成StreamGraph后经过Operator Chain优化后形成的&#xff0c;然后提交给JobManager的Restserver&#xff0c;最终转发给JobManager的Dispatcher处理。 Completa…

【Unity每日一记】让一个物体按余弦曲线移动—(三角函数的简单运用)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

AI黑马挑战赛,探索研发新趋势丨IDCF

随着AI的出现&#xff0c;获取知识的成本大幅降低&#xff0c;当DevOps与AI相结合时&#xff0c;必将产生全新的化学反应。不断涌现的AI新工具提醒我们&#xff0c;一个全新的研发工作范式正在逐渐形成。而DevOps的核心理念是敏捷协同&#xff0c;作为工程师&#xff0c;如何通…

滑模控制器理论推导和matlab/simulink实例分享

滑模控制的运动轨迹主要分为两个方面&#xff1a;(1)系统的任意初始状态向滑模面运动阶段&#xff1b;(2)系统到达滑模面后并且慢慢趋于稳定的阶段。所以&#xff0c;对于滑模变结构控制器的设计&#xff0c;对应于系统运动的两个阶段&#xff0c;可以分为两个部分&#xff1a;…