当前位置: 首页 > 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.dtcms.com/a/263474.html

相关文章:

  • Prompt:提示词工程
  • postgresql增量备份系列二 pg_probackup
  • Linux云计算基础篇(2)
  • ADP3120AJRZ-RL 【ADI】 6A高速MOSFET驱动器,让电源效率飙升!
  • Python-Word文档、PPT、PDF以及Pillow处理图像详解
  • Prompt Enginering
  • django 数据表外键 删除时 对应表的数据不删除如何设置
  • 随笔 | 写在六月的最后一天,也写在2025年上半年的最后一天
  • 2025年6月个人工作生活总结
  • 深入 ARM-Linux 的系统调用世界
  • vue常见问题:
  • 手机APP预约心理咨询师指南
  • 服务器上设置了代理之后,服务器可以访问外网,但是不能访问服务器本地。如何解决
  • CentOS 7 8 安装 madam
  • Android 中 使用 ProgressBar 实现进度显示
  • C++ 安装使用教程
  • MongoDB 安装使用教程
  • Nginx入门
  • 如何在 iOS 上线前做好安全防护?IPA 混淆与逆向防护实践详解
  • 【区块链安全】代理合约中的漏洞
  • 车载ECU刷写文件格式汇总详解
  • CppCon 2018 学习:Applied Best Practices
  • APP 内存测试--Android Memory Profiler实操(入门版)
  • ACE之ACE_NonBlocking_Connect_Handler问题分析
  • 【FineDataLink快速入门】01界面介绍-运维中心
  • AI教育全景图:谁在领跑2025?
  • 【Debian】1- 安装Debian到物理主机
  • STM32——DAP下载程序和程序调试
  • 【C++】经典string类问题
  • 【数字人开发】结合nextHuman平台进行数字人网页端开发