访问者模式是啥?咋实现呀?

简介: 访问者模式是啥?咋实现呀?

一 场景

面试官:简历上写你熟读设计模式,那我问你访问者模式是什么?

杨乐乐:这个..不会(这么冷门,谁知道那是啥)

面试官:再见来不及握手

  杨乐乐,不知道的问题,你清楚吗?我想很多人都不清楚,是的,他的确比较冷门,但我想不常用的东西,不代表没有价值,多了解多学习一点,也有可能是那厚积薄发中最重要的一部分。

  在编程道路上,我向每个人或多或少都有过这样一种体验,我学了很多东西,但是好像都没用到,可是突然有一天,接到一个功能,就是用到了之前了解的技术。也许这就是你的一个机会也说不一定。

  其实对于设计模式而言,是大家都知道的,写代码的利器,但是很多人还是没有仔细研究他,为什么,因为大多数的课程中都没有写设计模式在面试中扮演主要角色,甚至很多技术栈里面也没有。也许这就是行业现状,过多的最新而忽略基础,很多程序员抱着视频如获至宝,但是一场场视频看下来,却发现,学到的大多数是表面,大多数是闻其名,而没有通其理,为什么呢,因为基础不牢,地动山摇,又因为学习编程,需要的不单单是看,更重要的做。

二 访问者模式

  顾名思义,和访问者有关,理解起来就是传入不同的访问者,然后不同的访问者做同一件事,却得到了不同的结果,落实到代码里面就是,不同的访问者,访问同一个方法,但是返回的结果不同,其实并不是同一个方法。

public interface Visitor {

    // 访问学生信息
    void visit(Student student);

    // 访问老师信息
    void visit(Teacher teacher);

}

我们看到 有一个访问者的抽象类,他会访问学生和老师。但是方法的名称是相同的

// 家长
public class Parent implements Visitor {

    private Logger logger = LoggerFactory.getLogger(Parent.class);

    public void visit(Student student) {
        logger.info("学生信息 姓名:{} 班级:{} 排名:{}", student.name, student.clazz, student.ranking());
    }

    public void visit(Teacher teacher) {
        logger.info("老师信息 姓名:{} 班级:{} 级别:{}", teacher.name, teacher.clazz, teacher.identity);
    }

}
public class Principal implements Visitor {

    private Logger logger = LoggerFactory.getLogger(Principal.class);

    public void visit(Student student) {
        logger.info("学生信息 姓名:{} 班级:{}", student.name, student.clazz);
    }

    public void visit(Teacher teacher) {
        logger.info("学生信息 姓名:{} 班级:{} 升学率:{}", teacher.name, teacher.clazz, teacher.entranceRatio());
    }

}

而这访问人呢,一个是家长一个是校长,

下面是被访问者

public class Student extends User {

    public Student(String name, String identity, String clazz) {
        super(name, identity, clazz);
    }

    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public int ranking() {
        return (int) (Math.random() * 100);
    }}
}


// 展示
public void show(Visitor visitor) {
    for (User user : userList) {
        user.accept(visitor);
    }
}

这样一个访问者模式的使用就完成了,其中最重要的就是利用了,不同访问者调用同一个方法名所得结果不同。

相关文章
|
域名解析 网络协议 Linux
在Linux中,如何配置DNS服务器?
在Linux中,如何配置DNS服务器?
|
存储 人工智能 数据处理
这些夺冠瞬间报道背后,原来由阿里云技术支持!
这些夺冠瞬间报道背后,原来由阿里云技术支持!
148 6
|
缓存 NoSQL Java
SpringBoot 分布式锁 @klock详解
SpringBoot 分布式锁 @klock详解
400 0
SpringBoot 分布式锁 @klock详解
从代码中寻找生活的哲理
【9月更文挑战第26天】在编程的世界里,我们常常被复杂的逻辑和冗长的代码所困扰。然而,如果我们换一个角度,将编程看作是一种生活方式,那么我们就可以从中找到许多生活的哲理。本文将通过一些简单的编程示例,探讨如何从代码中寻找生活的哲理。
|
算法 数据中心 C++
基于C++雪花算法工具类Snowflake -来自chatGPT
基于C++雪花算法工具类Snowflake -来自chatGPT
187 1
|
移动开发 JSON JavaScript
VUE2.0快速入门(二)
VUE2.0快速入门
139 2
|
XML 监控 Java
《Java程序性能优化 让你的Java程序更快、更稳定》阅读笔记
《Java程序性能优化 让你的Java程序更快、更稳定》阅读笔记
177 0
|
程序员 Android开发 容器
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(一)上
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(一)
195 0
|
存储 弹性计算 运维
Lindorm-Operator云原生实践
Kubernetes 的CRD 机制(CustomResourceDefinition)支持通过自定义的controller来管理资源的生命周期,这样就可以像操作pod,deployment一样来方便的管理运维一些复杂的资源对象。伴随着云原生这股技术浪潮,lindorm-operator充分利用k8s底座的特点与优势,在云环境(包括公共云、私有云和混合云)极大提升了Lindorm数据库的生产和运维效率
495 0
|
机器学习/深度学习 JSON 监控
23【在线日志分析】之改造CDH的HDFS的NN,DN进程,日志输出为json格式
1.登录nn机器,进入最新序号的namenode配置文件夹,查看当前的nn的log4j配置 [root@sht-sgmhadoopnn-01 ~]# cd /var/run/cloudera-scm-agent/process/ [root@sht-sgmhadoopnn-01 process]# ls -lrt .
1411 0