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

重庆网站制作济南西安网站建设公

重庆网站制作济南,西安网站建设公,查企业的网站有哪些,关键词堆砌的作弊网站访问者设计模式 🚩什么是访问者设计模式?🚩访问者设计模式的特点🚩访问者设计模式的结构🚩访问者设计模式的优缺点🚩访问者设计模式的Java实现🚩代码总结🚩总结 🚩什么是…

访问者设计模式

  • 🚩什么是访问者设计模式?
  • 🚩访问者设计模式的特点
  • 🚩访问者设计模式的结构
  • 🚩访问者设计模式的优缺点
  • 🚩访问者设计模式的Java实现
  • 🚩代码总结
  • 🚩总结

🚩什么是访问者设计模式?

访问者设计模式(Visitor Pattern) 是一种 行为型设计模式,它允许你将算法与对象结构分离,使得可以在不修改现有对象结构的情况下定义新的操作。访问者模式将相关操作集中到一个访问者对象中,而不是分散在各个元素类中。

使用场景

  • 当需要对一个复杂对象结构(如组合结构)中的元素执行多种不同操作时

  • 当对象结构中的元素类很少变化,但需要经常定义新操作时

  • 当需要避免"污染"元素类,将相关操作集中管理时

  • 适用于 编译器语法树分析文档处理报表生成 等场景

🚩访问者设计模式的特点

  • 双重分派:通过两次方法调用实现动态绑定

  • 操作集中化:将相关操作集中到访问者对象中

  • 数据结构稳定:对象结构中的元素类很少变化

  • 扩展性好:新增操作只需添加新的访问者类

  • 访问权限高:访问者可以访问元素类的内部状态

🚩访问者设计模式的结构

访问者模式主要包含以下部分:

  • Visitor(抽象访问者):声明访问各种具体元素的接口

  • ConcreteVisitor(具体访问者):实现抽象访问者声明的操作

  • Element(抽象元素):定义accept方法接受访问者

  • ConcreteElement(具体元素):实现accept方法

  • ObjectStructure(对象结构):维护元素集合,提供访问入口

图例:

在这里插入图片描述

🚩访问者设计模式的优缺点

✅ 优点

  • 增加新操作容易:只需增加新的访问者类

  • 操作集中管理:相关行为集中在一个访问者中

  • 访问者可以累积状态:在遍历过程中收集信息

  • 符合单一职责原则:将相关操作分离到不同访问者

  • 数据结构和操作解耦:数据结构可以独立演化

❌ 缺点

  • 增加新元素类困难:每增加一个元素类都要修改访问者接口

  • 破坏封装性:访问者需要访问元素的内部状态

  • 违反依赖倒置原则:具体元素依赖具体访问者

  • 复杂度高:对简单结构使用访问者模式可能过度设计

🚩访问者设计模式的Java实现

代码地址:GitHub

  • 定义一个访问者接口Visitor
/*** @author hanson.huang* @version V1.0* @ClassName Visitor* @Description 访问者接口* @date 2025/3/26 14:02**/
public interface Visitor {public void visitStudent(Student student); // 访问学生public void visitTeacher(Teacher teacher); // 访问老师
}
  • 创建具体的访问者Visitor1Visitor2,用于实现不同的统计逻辑

    • Visitor1
    /*** @author hanson.huang* @version V1.0* @ClassName Visitor1* @Description 访问者1* @date 2025/3/26 14:09**/
    public class Visitor1 implements Visitor { // 访问者1:统计年龄总和private int studentAgeSum = 0;private int teacherAgeSum = 0;public int getStudentAgeSum() {return studentAgeSum;}public int getTeacherAgeSum() {return teacherAgeSum;}@Overridepublic void visitStudent(Student student) {System.out.println("访问者1访问学生:" + student.getName() + " 年龄:" + student.getAge());studentAgeSum += student.getAge();}@Overridepublic void visitTeacher(Teacher teacher) {System.out.println("访问者1访问老师:" + teacher.getName() + " 年龄:" + teacher.getAge());teacherAgeSum += teacher.getAge();}
    }
    
    • Visitor2
    /*** @author hanson.huang* @version V1.0* @ClassName Visitor2* @Description 访问者2* @date 2025/3/26 14:11**/
    public class Visitor2 implements Visitor {// 访问者2:求最高成绩和工龄private int maxScore = -1;private int maxWorkYear = -1;public int getMaxScore() {return maxScore;}public int getMaxWorkYear() {return maxWorkYear;}@Overridepublic void visitStudent(Student student) {System.out.println("访问者2访问学生:" + student.getName() + " 成绩:" + student.getScore());maxScore = Math.max(maxScore, student.getScore());}@Overridepublic void visitTeacher(Teacher teacher) {System.out.println("访问者2访问老师:" + teacher.getName() + " 工龄:" + teacher.getWorkYear());maxWorkYear = Math.max(maxWorkYear, teacher.getWorkYear());}
    }
    
  • 创建抽象类Person,定义Accept方法接受访问者

/*** @author hanson.huang* @version V1.0* @ClassName Person* @Description 抽象类, 定义accept方法接受访问者* @date 2025/3/26 14:04**/
public abstract class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}public abstract void Accept(Visitor visitor);
}
  • 创建两个具体的元素StudentTeacher,实现Accept方法

    • Student
    /*** @author hanson.huang* @version V1.0* @ClassName Student* @Description 具体元素 学生* @date 2025/3/26 14:07**/
    public class Student extends Person {private int score;public Student(String name, int age, int score) {super(name, age);this.score = score;}public int getScore() {return score;}@Overridepublic void Accept(Visitor visitor) {visitor.visitStudent(this);}
    }
    
    • Teacher
    /*** @author hanson.huang* @version V1.0* @ClassName Teacher* @Description 具体元素 老师* @date 2025/3/26 14:08**/
    public class Teacher extends Person {private int workYear;public Teacher(String name, int age, int workYear) {super(name, age);this.workYear = workYear;}public int getWorkYear() {return workYear;}@Overridepublic void Accept(Visitor visitor) {visitor.visitTeacher(this);}
    }
    
  • 创建对象结构PersonStructure ,维护元素集合并提供访问入口

/*** @author hanson.huang* @version V1.0* @ClassName PersonStructure* @Description 构造对象* @date 2025/3/26 14:13**/
public class PersonStructure {private List<Person> personList = new ArrayList<>();public PersonStructure() {personList.add(new Student("张三", 20, 70));personList.add(new Student("李四", 21, 80));personList.add(new Student("王五", 22, 90));personList.add(new Teacher("李老师", 26, 3));personList.add(new Teacher("陈老师", 27, 4));personList.add(new Teacher("刘老师", 28, 5));}public void Accept(Visitor visitor) {for (Person person : personList) {person.Accept(visitor);}}
}
  • 测试访问者模式
/*** @author hanson.huang* @version V1.0* @ClassName VisitorPattern* @Description 测试访问者设计模式* @date 2025/3/26 14:16**/
public class VisitorPattern {public static void main(String[] args) {PersonStructure structure  = new PersonStructure();Visitor1 visitor1 = new Visitor1();System.out.println("访问者1的访问记录:");structure.Accept(visitor1);System.out.println("学生年龄的总和:" + visitor1.getStudentAgeSum() + " 老师年龄的总和:" + visitor1.getTeacherAgeSum());System.out.println("=========================================");Visitor2 visitor2 = new Visitor2();System.out.println("访问者2的访问记录:");structure.Accept(visitor2);System.out.println("学生的最高成绩:" + visitor2.getMaxScore() + " 老师的最高工龄:" + visitor2.getMaxWorkYear());}
}

📌 运行结果

在这里插入图片描述

🚩代码总结

  • Visitor 接口定义了对不同元素的访问操作

  • Visitor1Visitor2 是具体访问者,实现不同的统计逻辑

  • Person 是抽象元素,定义accept方法接受访问者

  • StudentTeacher 是具体元素,实现accept方法

  • PersonStructure 是对象结构,维护元素集合并提供访问入口

  • 客户端可以轻松添加新的访问者而不修改现有类结构

🚩总结

  • 访问者设计模式 将算法与对象结构分离,便于新增操作

  • 核心是 双重分派机制,通过两次方法调用实现动态绑定

  • 适用于 数据结构稳定但操作频繁变化 的场景

✅ Java源码中的应用场景:

  • Java注解处理器(APT):

    • 处理注解时使用访问者模式遍历语法树

遍历文件系统时使用访问者模式

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述


文章转载自:

http://3UrcZf2u.rrqbm.cn
http://VaEbSc2L.rrqbm.cn
http://6icF7o1B.rrqbm.cn
http://xOoqrujm.rrqbm.cn
http://uwqkqywL.rrqbm.cn
http://ZFWStvgr.rrqbm.cn
http://57IpXnSc.rrqbm.cn
http://6EuKY9iE.rrqbm.cn
http://YBVsviN6.rrqbm.cn
http://jncVEPBH.rrqbm.cn
http://3LZ33K8n.rrqbm.cn
http://7lPTFOxJ.rrqbm.cn
http://6dAXEnIZ.rrqbm.cn
http://jr6texOo.rrqbm.cn
http://sPwhn6aT.rrqbm.cn
http://GTToX2JI.rrqbm.cn
http://hMCGgjOm.rrqbm.cn
http://dNjovmDz.rrqbm.cn
http://ZDtaAqKh.rrqbm.cn
http://TpUg2wy4.rrqbm.cn
http://CPPGOlTw.rrqbm.cn
http://oA7RRDIm.rrqbm.cn
http://ArrWP2Ds.rrqbm.cn
http://8ZNQ9YX8.rrqbm.cn
http://vbEil0Vw.rrqbm.cn
http://JazQEAIl.rrqbm.cn
http://ctEwpGOI.rrqbm.cn
http://NYQ3qzpu.rrqbm.cn
http://1GQ1NmyD.rrqbm.cn
http://UaZlXdIn.rrqbm.cn
http://www.dtcms.com/wzjs/758568.html

相关文章:

  • 网站默认主页设置wordpress在文章中加背景
  • 简单网站模板下载网站建设产品图
  • dw网站模板下载地址水利建设公共服务平台网站
  • 企业网站seo点击软件北京最新
  • 用手机制作网站做网站专业术语
  • 网站开发实用技术2.8.5西安商城网站开发
  • 广西金水建设开发有限公司网站wordpress主题jquery
  • 怎么制作公众号封面图滨州seo排名
  • 佛山电商网站建设wordpress远程保存图片
  • 个人网站建设详细教程网站建设主要包括什么
  • 烟台环保网站建设内蒙古网站建设费用
  • 网站开发php有哪些目前做响应式网站最好的cms
  • 博罗网站定制怎么查公司网站有没有中文域名
  • 德阳网站seo有没有类似一起做网店的网站
  • 金坛市政建设有限公司网站网站页面禁止访问
  • 政务咨询投诉举报网站建设平面设计网上接单
  • wordpress 无法注册湖南企业竞价优化公司
  • 厦门 外贸网站定制型网站制作
  • 网站维护与排名网站运营需要学什么
  • 电影网站这么做关键词先进的网站建设
  • 哪个网站可以做视频播放器从事网站开发需要什么
  • 建设常规的网站报价是多少网站描述怎么写比较好
  • 解释网站为什么这样做wordpress登陆页面模板
  • 微网站 html盘多多搜索引擎入口
  • 陕西建设厅执业注册中心网站做网站的属于什么专业
  • 哪里有给网站做什么公司适合做seo优化
  • 如何做网站描述wordpress 主题下载
  • 12306网站为什么做那么差asp.net做网站教程
  • 城乡建设主管部门官方网站wordpress cu主题
  • 德阳网站建设怎么做查询数据输入的网站