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

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

一 场景

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

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

面试官:再见来不及握手

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

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

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

二 访问者模式

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

public interface Visitor {

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

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

}
AI 代码解读

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

// 家长
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());
    }

}
AI 代码解读

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

下面是被访问者

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);
    }
}

AI 代码解读

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

相关文章
访问者模式
访问者模式是一种行为型设计模式,用于将数据结构与其操作解耦。通过在不改变数据结构的前提下增加新的操作,访问者模式提供了一种灵活的方式来实现功能扩展。其关键特性包括分离操作、支持扩展和双分派机制。适用于需要对对象结构中的元素执行多种操作、频繁扩展操作以及不希望操作逻辑和数据结构耦合的场景。常见的使用案例包括编译器中的语法树、文件系统和游戏场景。优点是增加操作时无需修改数据结构,符合开闭原则;缺点是添加新的数据结构类型时需要修改所有访问者类,维护成本较高。
54 3
访问者模式问题之在不使用访问者模式的情况下,怎么在一个 SelectNode 类中实现 extractFunctions 方法
访问者模式问题之在不使用访问者模式的情况下,怎么在一个 SelectNode 类中实现 extractFunctions 方法
行为型设计模式11-访问者模式
行为型设计模式11-访问者模式
59 1
|
9月前
|
行为型 访问者模式
行为型 访问者模式
68 0
行为型 迭代器模式
行为型 迭代器模式
51 0
设计模式~访问者模式(Visitor)-15
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对
59 0
今天说说你不知道的访问者模式
今天说说你不知道的访问者模式
88 0
我学会了,访问者模式
访问者模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
127 0
我学会了,访问者模式

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等