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

设计模式-访问者模式

一.所用到的类

访问者模式是一个多对多的关系

1.所要被访问的类

一个公共抽象类:属性和accept方法,用来接收访问者
实现抽象类的N个类

2.访问者类

一个抽象接口 里面定义要访问N个类的方法
实现抽象接口的 N个类

二、是实现代码

所要被访问的类的抽象类

public abstract class User {public String name;public String identity; // 身份public String clazz;public User(String name, String identity, String clazz){this.name = name;this.identity = identity;this.clazz = clazz;}public abstract void accept(Visitor visitor);
}

所要被访问的类1

public class Student extends User{public Student(String name, String identity, String clazz){super(name, identity, clazz);}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}

所要被访问的类2

public class Teacher extends User{public Teacher(String name, String identity, String clazz) {super(name, identity, clazz);}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}

访问类的接口

public interface Visitor {public void visit(Student student);public void visit(Teacher teacher);
}

访问类的实现类1

public class Parent implements Visitor{@Overridepublic void visit(Student student) {System.out.println("学生" + student.name + ",老师" + student.clazz );}@Overridepublic void visit(Teacher teacher) {System.out.println("老师" + teacher.name + ",身份" + teacher.clazz );}
}

访问类的实现类2

public class Principal implements Visitor{@Overridepublic void visit(Student student) {System.out.println("学生" + student.name + "的学号是:" + student.identity);}@Overridepublic void visit(Teacher teacher) {System.out.println("老师" + teacher.name + "班级:" + teacher.clazz);}
}

调用类

@SpringBootApplication
public class VisitorApplication {public static void main(String[] args) {User student = new Student("小王", "20250101", "一年一班");User teacher = new Teacher("李老师", "高级老师", "仨年一班");Visitor principal = new Principal();System.out.println("校长开始");student.accept(principal);teacher.accept(principal);System.out.println("\n家长开始");Visitor parent = new Parent();student.accept(parent);teacher.accept(parent);}
}

三、结果

在这里插入图片描述

四、总结

所要被访问的类要向外提供一个接收访问对象的方法,然后通过创建目标对象,调用这个方法,并传入访问类的实现类

http://www.lqws.cn/news/585487.html

相关文章:

  • PHP WebSocket服务器搭建指南
  • 深度学习03 人工神经网络ANN
  • 大数据(3)-Hive
  • iOS 应用上架踩坑实录:7 个问题 + 工具组合解决方案详解
  • STL简介+string模拟实现
  • 【Docker基础】Docker数据持久化与卷(Volume)介绍
  • 24V转12V降压实际输出12.11V可行性分析
  • gravitino0.9 安装部署集成Trino-439查询Hive3.1.3和MySQL8.0.33
  • 88.LMS当幅度和相位同时失配时,为啥最后权值w的相位angle(w(end))收敛到angle(mis)不是-angle(mis)
  • 从零到一通过Web技术开发一个五子棋
  • SpringBoot --项目启动的两种方式
  • js遍历对象的方法
  • 【MySQL】数据库基础
  • .net8导出影像图片按现场及天拆分
  • 51单片机CPU工作原理解析
  • 借助 KubeMQ 简化多 LLM 集成
  • YOLOv12_ultralytics-8.3.145_2025_5_27部分代码阅读笔记-torch_utils.py
  • 后台填坑记——Golang内存泄漏问题排查(一)
  • 设计模式(六)
  • 大模型开源技术解析 4.5 的系列开源技术解析:从模型矩阵到产业赋能的全栈突破
  • 2025年06月30日Github流行趋势
  • 遥控器双频无线模块技术要点概述
  • SegChange-R1:基于大型语言模型增强的遥感变化检测
  • 07-three.js Debug UI
  • Webpack原理剖析与实现
  • QT中QSS样式表的详细介绍
  • 【MySQL基础】MySQL索引全面解析:从原理到实践
  • 汽车轮速测量专用轮速传感器
  • 51c~UWB~合集1
  • SpringBoot项目开发实战销售管理系统——项目框架搭建!