-- 以下为转载内容 ---
在《GoF 23种设计模式模式解析附C++实现源码》和《设计模式解析之—Visitor模式》中,我给出了Visitor模式的诠释和示例实现源码。
个人觉得例子和解析还是能够比较清晰地为学习和掌握Visitor模式提供一些信息,但是对于其中的一个重要知识没有很好地解释,
这就是multi-dispatch(多分派),multi-dispatch(多分派)是Visitor模式的关键,实际上Visitor模式就是提供了一种multi-dispatch(多分派)
中的double dispatch(双分派)的实现方式。
double dispatch(双分派)是multi-dispatch(多分派)的特例,由于Visitor模式涉及的是double dispatch(双分派),
因此这里仅仅讨论double dispatch(双分派)的内容。实际上double dispatch(双分派)是一种很经典的技术,但是当前
的主流的面向对象程序设计语言(例如C++/Java/C#等)都并不支持多分派,仅仅支持单分派(single dispatch)。
单分派(single dispatch)的含义比较好理解,单分派(single dispatch)就是说我们在选择一个方法的时候仅仅需要根
据消息接收者(receiver)的运行时型别(Run time type)。实际上这也就是我们经常提到的多态的概念(当然C++中的函
数重载也是Sigle dispatch的一种实现方式)。举一个简单的例子,我们有一个基类A,A有一个虚方法f(可被子类override),
D1和D2是A的两个子类,在D1和D2中我们覆写(override)了方法f。
这样我们对消息f的调用,需要根据接收者A或者A的子类D1/D2的具体型别才可以确定具体是调用A的还是D1/D2的f方法。
double dispatch(双分派)则在选择一个方法的时候,不仅仅要根据消息接收者(receiver)
的运行时型别(Run time type),还要根据参数的运行时型别(Run time type)。
当然如果所有参数都考虑的话就是multi-dispatch(多分派)。也举一个简单的例子,
同于上面单分派中例子,A的虚方法f带了一个C型别的参数,C也是一个基类,C有也有两个具体子类E1和E2。
这样,当我们在调用消息f的时候,我们不但要根据接收者的具体型别(A、D1、D2),
还要根据参数的具体型别(C、E1、E2),才可以最后确定调用的具体是哪一个方法f。
分享到:
相关推荐
然而,为了深入理解这一模式,我们需要探讨一个相关概念——【双分派(Double Dispatch)】。 双分派是指在运行时,不仅根据对象的类型决定调用哪个方法,还根据方法参数的类型决定调用哪个具体实现。这与单分派...
本节应用命令模式,在Java中模拟双分派。理解本节后,访问者模式(visitor pattern)手到擒来。分派/dispatch是指如何给一个消息绑定其方法体。Java、C#等仅仅支持单分派(singledispatch)而不支持双分派(double ...
双分派常见于设计模式中的访问者模式,其中调用者和被调用者都参与到了方法的选择过程中。在Java中,实现双分派通常需要借助反射或者虚拟机的特性,如Java 5引入的泛型和枚举,以及一些编译器优化技术。 理解动态...
总的来说,访问者模式是一种设计模式,它允许在不修改已有类结构的情况下增加新的操作。在Java中,结合动态绑定和静态绑定的概念,访问者模式可以帮助我们更好地处理复杂对象结构的遍历和操作。动态绑定提供了多态性...
在这个"一个Delphi分派程序演示"中,我们将深入探讨Delphi中的分派机制,这是面向对象编程中的一个重要概念。 分派(Dispatch)是面向对象程序设计中的核心机制之一,它涉及到消息的传递和处理。在Delphi中,当我们...
25.4.3 双分派 25.5 最佳实践 第26章 状态模式 26.1 城市的纵向发展功臣—电梯 26.2 状态模式的定义 26.3 状态模式的应用 26.3.1 状态模式的优点 26.3.2 状态模式的缺点 26.3.3 状态模式的应用 26.3.4 状态模式的...
**typescript例子-异步方法分派(AMD模式)** AMD(Asynchronous Module Definition)是一种JavaScript模块化开发的方式,尤其在处理大型项目时,它能够帮助我们有效地组织代码,实现异步加载。AMD模式由RequireJS...
请求重定向和请求分派技术详解 请求重定向和请求分派是 MVC 架构中关键的技术,它们在 Web 应用程序中扮演着重要的角色。本文将详细介绍请求重定向和请求分派的概念、实现方法和应用场景。 一、请求重定向 请求...
模板方法模式是行为类模式中的一种,使用继承机制在类间分派行为。 解释器模式是行为类模式中的一种,它将一个文法表示为一个类层次,并实现一个解释器作为这些类的实例上的一个操作。解释器模式也使用继承机制在类...
- **4.3 也谈double dispatch(双分派):: Visitor模式**:通过解释双分派的概念,进一步阐述了Visitor模式的工作原理及其优势。 - **4.4 为什么使用设计模式——从Singleton模式谈起**:通过分析Singleton模式的...
7. 深入理解与实践:文档中提到作者也会在C++实现源码中深入解析State模式,探讨双分派在Visitor模式中的应用,以及为什么使用设计模式等,强调了实践和深入理解设计模式的重要性。 8. 学习过程的思考:作者将学习...
双分派语言如Java支持访问者模式,但并非必需,因为语言特性可以直接实现类似功能。 7. 中介者模式:中介者模式是用来降低多个对象之间的耦合度,它提供一个中介对象来协调各个对象的交互。相比观察者模式,中介者...
所涉及的设计模式包括工厂模式、单例模式、建造模式、原型模式、适配器模式、桥梁模式、组合模式、装饰模式、门面模式、享元模式、代理模式、责任链模式、命令模式、解释器模式、迭代器模式、调停者模式、备忘录模式...
为了解决这一问题,访问者模式可以采用双分派实现,即在元素类中也包含一个访问者类型参数,这样在访问者接口中只需要声明一个通用的 visit 方法,而元素类则根据自身类型决定调用哪个具体方法。 双分派的实现原理...
- **Visitor(访问者)**:访问者模式将一个操作作用于某个对象结构中的各个元素,它符合“双分派”原则。 - **Iterator(迭代器)**:迭代器模式提供了一种方法来顺序访问一个聚合对象中各个元素,而又不需要暴露该...
java的动态绑定 所谓的动态绑定是指程执行期间(而不是在编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。java继承体系中的覆盖是动态绑定的,看一下如下的代码: class Father { ...
而Visitor模式,也谈doubledispatch(双分派),这种模式可以在不改变已有对象结构的前提下增加新的操作。 总之,设计模式作为软件开发中的一种重要工具,不仅可以提高开发效率,还能使得代码结构更加清晰,易于扩展...
彻底搞懂访问者模式的静态、动态和伪动态分派(csdn)————程序