二十三种设计模式第二十四篇--访问者模式(完结撒花)

2023-11-01

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。
通过这种方式,元素的执行算法可以随着访问者改变而改变。
这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。

访问者模式的核心组成部分包括:

抽象元素(Element):定义了一个接受访问者对象的方法,即accept()方法,用于调用访问者的操作。

具体元素(Concrete Element):实现了抽象元素接口,并实现了accept()方法,根据元素对象的类型选择相应的操作。

抽象访问者(Visitor):定义了访问者对象的接口,包含了对不同元素对象进行访问的方法。

具体访问者(Concrete Visitor):实现了抽象访问者接口,具体定义了对不同元素对象的访问操作。

访问者模式的主要优点包括:

增加新的操作非常方便:通过增加新的具体访问者类,可以非常方便地增加新的操作或算法,而无需修改现有的元素类。

将有关的行为集中到一个访问者中:通过将相似的操作集中到同一个访问者中,可以使得代码更加清晰、模块化和可维护。

良好的扩展性:在增加新的元素类时,只需要实现元素的接受访问者方法和具体访问者的相应操作,不需要修改其他类。

缺点:

1、具体元素对访问者公布细节,违反了迪米特原则。
2、具体元素变更比较困难。
3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。

在这里插入图片描述

//5.对象结构(Object Structure)角色:是一个包含元素角色的容器,提供让访问者对象遍历容器中的所有元素的方法,
// 通常由 List、Set、Map 等聚合类实现。
public class Computer implements ComputerPart {
   //组合模式:也可以用迭代器替换
   ComputerPart[] parts;
 
   public Computer(){
      parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};      
   } 
 
 
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      for (int i = 0; i < parts.length; i++) {
         parts[i].accept(computerPartVisitor);
      }
      computerPartVisitor.visit(this);
   }
}

// 组合模式+访问者模式
/*
 * 抽象元素(Element)角色: 声明一个包含接受操作 accept() 的接口,被接受的访问者对象作为 accept() 方法的参数。
 */
public interface ComputerPart {
   //要用  computerPartVisitor 对象来对当前的元素进行处理
   //ComputerPartVisitor是一个接口,有处理元素的方法.
   public void accept(ComputerPartVisitor computerPartVisitor);

}
//抽象访问者(Visitor)角色:定义一个访问具体元素的接口,
// 为每个具体元素类对应一个访问操作 visit() ,该操作中的参数类型标识了被访问的具体元素。
public interface ComputerPartVisitor {
   //访问者 处理每个具体的元素。
   public void visit(Computer computer);
   public void visit(Mouse mouse);
   public void visit(Keyboard keyboard);
   public void visit(Monitor monitor);
}
//具体访问者(ConcreteVisitor)角色:实现抽象访问者角色中声明的各个访问操作,确定访问者访问一个元素时该做什么
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
 
   @Override
   public void visit(Computer computer) {
      //TODO:具体的处理。。。
      System.out.println("Displaying Computer.");
   }
 
   @Override
   public void visit(Mouse mouse) {
      //可以从mouse中取出具体对象的数据,进行相应的处理了.
      System.out.println("Displaying Mouse.");
   }
 
   @Override
   public void visit(Keyboard keyboard) {
      System.out.println("Displaying Keyboard.");
   }
 
   @Override
   public void visit(Monitor monitor) {
      System.out.println("Displaying Monitor.");
   }
}
//4.具体元素(ConcreteElement)角色:实现抽象元素角色提供的 accept() 操作,其方法体通常都是 visitor.visit(this) ,另外具体元素中可能还包含本身业务逻辑的相关操作。
public class Keyboard  implements ComputerPart {
 
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}
public class Monitor  implements ComputerPart {
 
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}
//具体的元素类:包装数据
public class Mouse  implements ComputerPart {
   //TODO:这里是每个类具体的数据

 
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);  //处理功能分开, 包装功能
   }
}
public class VisitorPatternDemo {
   public static void main(String[] args) {
 
      ComputerPart computer = new Computer();
      computer.accept(new ComputerPartDisplayVisitor());
   }
}

行文至此,关于二十三篇设计模式终于算是完结了,可能以后的日子我会将这二十三篇博客进行进一步的细化和归纳总结,也或许就这样了,这个得看我将来是否继续抽时候在此,或者是否在将来继续从事这个行业了,有了一定的经验,那么我将继续在此二十三篇设计模式上继续拓展和填写一些坑。
还是那句话,学无止境,编程这条路,一直学一直学,但是必须得专攻一个方向!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二十三种设计模式第二十四篇--访问者模式(完结撒花) 的相关文章

随机推荐

  • 【Cadance allegro 16.6软件操作流程的总结】

    Cadance allegro 16 6软件操作流程的总结
  • 慕课网python学习笔记:2.迭代对象

    文章目录 1 迭代器与可迭代对象 2 迭代判断方法 1 判断是不是可以迭代 用Iterable 2 判断是不是迭代器 用Iterator 3 实现迭代器与可迭代对象 1 迭代器与可迭代对象 1 迭代器 iterator是一个表示数据流的对象
  • 测试中

    初始块 config chainId 12345 homesteadBlock 0 eip155Block 0 eip158Block 0 coinbase 0x000000000000000000000000000000000000000
  • OpenCL入门

    个人博客地址 https cxx001 gitee io OpenCL框架 OpenCL是一个异构平台编程框架 也是异构并行计算的行业标准 由Khronos Group来维护 旨在充分利用GPU强大的并行计算能力以及CPU的协同工作 更高效
  • 彻底卸载alibabaprotect

    1 卸载阿里系软件 2 全局搜索pc sdk set 删除所在阿里目录 3 强制删除alibabaprotect所在目录
  • maven打包上传到私有仓库的步骤

    1 背景 最近有些自己制作的工具包 需要单独抽取出来之后 在打包的时候 同时上传到自己的maven私服仓库 供别人引用 并且还能够引用的时候看到源码 但是 在上传的过程中总是失败不成功 特别上火 最后总算成功 记录下步骤 希望能够帮助到需要
  • Java—包及访问权限

    包是一个文件夹 它是类的一种特殊的性质 可以更合理地管理大量的类文件 设置他人对类成员的访问权等 包的概念及使用 包的基本概念 在之前所编写的所有代码实际上都有一个问题 发现所有程序都直接保存在同一目录之中 但是 当一个大型程序由多个不同的
  • IDEA创建maven多级模块项目

    一 创建一个空项目 二 在空项目中创建模块 作为maven的parents 选择刚刚创建的空项目 并且给新模块起名字 三 设置JDK的版本 依赖方式 在pom xml文件中添加
  • antv-g2学习手册-上

    G2所构建出的图表是由一系列独立的图形元素组合而成的 数据Data 可视化最基础的部分 图形属性Attribute 负责将数据中的变量映射到图形空间 几何标记Geometry 即在图表中实际看到的图形元素 如点 线 多边形等 每个几何标记对
  • jquery ajax 回调函数里面再执行ajax函数,jQuery AJAX 和其回调函数

    1 什么是 AJAX AJAX 异步 JavaScript 和 XML Asynchronous JavaScript and XML 简短地说 在不重载整个网页的情况下 AJAX 通过后台加载数据 并在网页上进行显示 2 最基本的三个方法
  • 编程新贵——AOP,你不得不知道的事

    简介 AOP为Aspect Oriented Programming的缩写 意为 面向切面编程 也叫面向方面 可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态同意添加功能的一种技术 AOP实际是GoF设计模式的延续 设
  • Qt 子对象引用mainwindow指针的巧妙方法

    问题描述 最近在用qt开发项目的时候 有一个需要就是在子类中调用mainwindow指针 在mainwindow上显示内容 因为在mainwindow中需要生成子类的对象 所以不能在子类中引用mainwindow的头文件 这样会造成相互包含
  • viotile关键字是否重排序的实验

    起因 下面的评论中 有一个人提到 viotile的实现原理是使用了内存屏障 将new关键字语句的部分设置屏障 让还没有完成初始化的对象不能让外部读取到 而没有真正的禁止重排序 加上内存屏障后 确实能够实现在不禁止重排序的情况下 保证结果的正
  • 10个程序员可以接私活的平台和一些建议,兼职必看

    今天为大家分享一些可以接私单的平台 相信大家学习编程未来是希望成为一个软件工程师或者码农 找到好的工作 有好的发展 但是在还没有找工作之前 大家可以通过一些平台接一些兼职 一来能够赚钱 在主页保持稳定的情况下能够发展自己的副业 二来通过接项
  • 实验 :OSPF综合应用场景

    R1 interface GigabitEthernet0 0 0 ip address 12 1 1 1 255 255 255 0 interface GigabitEthernet0 0 1 interface GigabitEthe
  • ROS仿真小车模型的搭建

    sample sai robot urdf
  • Linux 高可用(HA)集群之heartbeat基于crm进行资源管理详解

    大纲 一 环境准备 二 拓扑准备 三 前提条件 四 安装相关软件 五 配置 heartbeat crm 资源管理器 六 crm资源管理器 七 crm图形界面配置详解 八 高可用集群架构回顾 九 crm配置资源 十 crm资源约束 十一 cr
  • Hyperledger Fabric Java语言Gradle 工程 链码离线安装

    需求 hyperledger fabric 分布式账本 由于其本身的特性 目前主要应用于大型国企和银行 其环境的部署一般是与外部网络隔离的 如果采用docker的部署方式 docker镜像可以通过导入即可 但是在安装和实例化的时候需要下载相
  • Leetcode:单调栈系列

    本人总结的单调栈大概有三类 求右边第一个比该元素大 小 的元素 求左边第一个比该元素大 小 的元素 求两边比该元素大 小 的元素 前两类一般是中等难度的题 完成一次单调栈即可 最后一类是困难难度 需要完成两次单调栈 进一步地 1 求右边第一
  • 二十三种设计模式第二十四篇--访问者模式(完结撒花)

    在访问者模式 Visitor Pattern 中 我们使用了一个访问者类 它改变了元素类的执行算法 通过这种方式 元素的执行算法可以随着访问者改变而改变 这种类型的设计模式属于行为型模式 根据模式 元素对象已接受访问者对象 这样访问者对象就