访问者模式问题之动态语言在实现访问者模式时有啥优势

简介: 访问者模式问题之动态语言在实现访问者模式时有啥优势

问题一:在 SqlVisitor 抽象类中,为什么需要为不同的 SqlNode 子类定义不同的 visit 方法?


在 SqlVisitor 抽象类中,为什么需要为不同的 SqlNode 子类定义不同的 visit 方法?


参考回答:

在 SqlVisitor 抽象类中为不同的 SqlNode 子类定义不同的 visit 方法,是为了实现访问者模式的核心思想——双分派。这样做允许访问者在访问不同类型的节点时执行不同的逻辑。当 SqlNode 对象的 accept 方法被调用时,它会根据对象的实际类型调用 SqlVisitor 中相应的 visit 方法,从而实现多态行为。这种设计使得 SQL 结构的解析和转换更加灵活和可扩展。


关于本问题的更多回答可点击原文查看:

https://developer.aliyun.com/ask/672299



问题二:为什么每个类的 accept 方法内容相同,但不能直接写在父类 SqlNode 中?


为什么每个类的 accept 方法内容相同,但不能直接写在父类 SqlNode 中?


参考回答:

每个类的 accept 方法内容相同,但不能直接写在父类 SqlNode 中,因为这样做会导致所有的 accept 调用都指向 SqlVisitor 中的 visit(SqlNode) 方法(如果该方法存在的话)。由于 Java 的重载是在编译时根据方法的参数类型决定的,而 this 在 accept 方法中的编译时类型是 SqlNode,因此无论实际运行时的对象是哪个子类,都会调用到 visit(SqlNode),从而忽略了具体的子类类型,导致其他重载的 visit 方法形同虚设,不符合预期。


关于本问题的更多回答可点击原文查看:

https://developer.aliyun.com/ask/672300



问题三:如果尝试在 SqlVisitor 中添加 visit(SqlNode) 方法会怎样?


如果尝试在 SqlVisitor 中添加 visit(SqlNode) 方法会怎样?


参考回答:

如果尝试在 SqlVisitor 中添加 visit(SqlNode) 方法,虽然可以通过编译,但会导致所有通过 accept 方法调用的 visit 都会指向这个 visit(SqlNode) 方法,因为 this 在 accept 方法中的编译时类型是 SqlNode。这样,无论 SqlNode 的实际子类是什么,都会执行这个通用的 visit(SqlNode) 方法,无法利用到具体子类的特性,程序的运行结果将不符合预期。


关于本问题的更多回答可点击原文查看:

https://developer.aliyun.com/ask/672301



问题四:Java 的重载为什么被称为“编译期多态”?


Java 的重载为什么被称为“编译期多态”?


参考回答:

Java 的重载被称为“编译期多态”,是因为重载的方法在编译时就已经根据方法的参数类型、参数数量和参数顺序确定了调用哪个方法。这种多态性是在编译时就确定的,与运行时的对象实际类型无关。因此,即使 this 在运行时指向的是 SqlNode 的子类对象,由于 accept 方法中的 this 在编译时的类型是 SqlNode,所以调用 visit(this) 时也会根据 SqlNode 类型来匹配 SqlVisitor 中的方法。


关于本问题的更多回答可点击原文查看:

https://developer.aliyun.com/ask/672302



问题五:动态语言在实现访问者模式时有什么优势?


动态语言在实现访问者模式时有什么优势?


参考回答:

动态语言在实现访问者模式时具有优势,因为它们通常支持运行时多态(也称为动态多态),这意味着方法的调用是在运行时根据对象的实际类型来决定的。这种特性使得在动态语言中实现访问者模式时,可以更加直接和简单地根据对象的实际类型来调用相应的 visit 方法,而无需像 Java 那样在编译时就确定方法调用。此外,一些支持模式匹配的函数式程序设计语言还可以进一步简化访问者模式的实现,使得代码更加清晰和易于维护。


关于本问题的更多回答可点击原文查看:

https://developer.aliyun.com/ask/672303

相关文章
|
7月前
|
设计模式
二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
126 0
|
2月前
|
数据处理 数据格式
|
2月前
|
设计模式
用建造者模式的思想改造构造方法。灵活,快捷的链式创建对象
【10月更文挑战第4天】该文本介绍使用建造者模式改造构造方法,以实现更灵活、快捷的对象创建。建造者模式将复杂对象的构建过程与表示分离,提高代码的灵活性和可维护性。针对传统构造方法参数过多、难以灵活设置属性等问题,通过创建产品类、建造者抽象类和具体建造者类,并采用链式调用来简化对象创建过程。
|
4月前
|
双11
访问者模式问题之在软件工程中,根据特性和场景决定是采用面向对象的抽象还是访问者的抽象,如何实现
访问者模式问题之在软件工程中,根据特性和场景决定是采用面向对象的抽象还是访问者的抽象,如何实现
|
4月前
|
设计模式 Java
访问者模式问题之访问者模式与回调模式之间有什么联系和区别
访问者模式问题之访问者模式与回调模式之间有什么联系和区别
|
7月前
|
设计模式 Rust Java
【一起学Rust | 设计模式】习惯语法——默认特质、集合智能指针、析构函数
【一起学Rust | 设计模式】习惯语法——默认特质、集合智能指针、析构函数
106 0
|
缓存 Java 程序员
函数式编程的Java编码实践:利用惰性写出高性能且抽象的代码
本文会以惰性加载为例一步步介绍函数式编程中各种概念,所以读者不需要任何函数式编程的基础,只需要对 Java 8 有些许了解即可。
函数式编程的Java编码实践:利用惰性写出高性能且抽象的代码
|
设计模式 Java
跨足不同领域:解析Java设计模式中的访问者模式
在软件开发领域,设计模式是一组经过验证的最佳实践方法,用于解决各种常见问题。访问者模式是一种行为型设计模式,其目标是在不改变被访问元素的前提下,将对元素的操作封装成独立的访问者对象。在本文中,我们将深入了解访问者模式的核心思想、应用场景以及它在Java中的实际运用。
91 0
|
安全 Java 编译器
深挖⾯向对象编程三⼤特性 --封装、继承、多态
深挖⾯向对象编程三⼤特性 --封装、继承、多态
深挖⾯向对象编程三⼤特性 --封装、继承、多态