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

设计模式-访问者模式

一.所用到的类

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

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.xdnf.cn/news/14729.html

相关文章:

  • TCPView v4.19 网络检测和拦截工具——东方仙盟
  • 《Effective Python》第十一章 性能——使用 timeit 微基准测试优化性能关键代码
  • xilinx axi datamover IP使用demo
  • HarmonyOS NEXT仓颉开发语言实战案例:电影App
  • Hive SQL 实战:电商销售数据分析全流程案例
  • 【期末分布式】分布式的期末考试资料大题整理
  • PCB工艺学习与总结-20250628
  • 推荐几本关于网络安全的书
  • Linux中《动/静态库原理》
  • python sklearn 机器学习(1)
  • Web应用开发 --- Tips
  • Windows 环境下设置 RabbitMQ 的 consumer_timeout 参数
  • 现代 JavaScript (ES6+) 入门到实战(三):字符串与对象的魔法升级—模板字符串/结构赋值/展开运算符
  • 华为云Flexus+DeepSeek征文 | 二次开发学习顾问系统对接华为云ModelArts Studio 实现智能答疑学习辅导
  • 设计模式之适配器模式
  • Unity Catalog 三大升级:Data+AI 时代的统一治理再进化
  • Leetcode 3598. Longest Common Prefix Between Adjacent Strings After Removals
  • JDK自带的HttpClient,替代Apache的更优解?
  • Spring Cloud:分布式事务管理与数据一致性解决方案
  • 【如何实现分布式压测中间件】
  • 【算法设计与分析】(二)什么是递归,以及分治法的基本思想
  • 【word】把参考文献序号统一换为上标
  • github上传代码步骤(http)
  • Redis--黑马点评--消息队列
  • 基于 SpringBoot 实现一个 JAVA 代理 HTTP / WS
  • 电压跟随器输入电压正常、输出电压等于0V?
  • WebRTC(十三):信令服务器
  • python动漫周边电商网站系统
  • 视频序列中的帧间匹配技术 FrameMatcher 详解
  • 领域驱动设计(DDD)【23】之泛化:从概念到实践