一 场景
面试官:简历上写你熟读设计模式,那我问你访问者模式是什么?杨乐乐:这个..不会(这么冷门,谁知道那是啥)
面试官:再见来不及握手
杨乐乐,不知道的问题,你清楚吗?我想很多人都不清楚,是的,他的确比较冷门,但我想不常用的东西,不代表没有价值,多了解多学习一点,也有可能是那厚积薄发中最重要的一部分。
在编程道路上,我向每个人或多或少都有过这样一种体验,我学了很多东西,但是好像都没用到,可是突然有一天,接到一个功能,就是用到了之前了解的技术。也许这就是你的一个机会也说不一定。
其实对于设计模式而言,是大家都知道的,写代码的利器,但是很多人还是没有仔细研究他,为什么,因为大多数的课程中都没有写设计模式在面试中扮演主要角色,甚至很多技术栈里面也没有。也许这就是行业现状,过多的最新而忽略基础,很多程序员抱着视频如获至宝,但是一场场视频看下来,却发现,学到的大多数是表面,大多数是闻其名,而没有通其理,为什么呢,因为基础不牢,地动山摇,又因为学习编程,需要的不单单是看,更重要的做。
二 访问者模式
顾名思义,和访问者有关,理解起来就是传入不同的访问者,然后不同的访问者做同一件事,却得到了不同的结果,落实到代码里面就是,不同的访问者,访问同一个方法,但是返回的结果不同,其实并不是同一个方法。
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);
}
}
这样一个访问者模式的使用就完成了,其中最重要的就是利用了,不同访问者调用同一个方法名所得结果不同。