`
xugang8289
  • 浏览: 8432 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转载]双分派模式

阅读更多
-- 以下为转载内容 ---

在《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。
分享到:
评论

相关推荐

    69丨访问者模式(下):为什么支持双分派的语言不需要访问者模式?1

    然而,为了深入理解这一模式,我们需要探讨一个相关概念——【双分派(Double Dispatch)】。 双分派是指在运行时,不仅根据对象的类型决定调用哪个方法,还根据方法参数的类型决定调用哪个具体实现。这与单分派...

    Java模拟双分派DoubleDispatch

    本节应用命令模式,在Java中模拟双分派。理解本节后,访问者模式(visitor pattern)手到擒来。分派/dispatch是指如何给一个消息绑定其方法体。Java、C#等仅仅支持单分派(singledispatch)而不支持双分派(double ...

    Java的动态绑定与双分派_动力节点Java学院整理

    双分派常见于设计模式中的访问者模式,其中调用者和被调用者都参与到了方法的选择过程中。在Java中,实现双分派通常需要借助反射或者虚拟机的特性,如Java 5引入的泛型和枚举,以及一些编译器优化技术。 理解动态...

    访问者模式商量篇:java的动态绑定与双分派_.docx

    总的来说,访问者模式是一种设计模式,它允许在不修改已有类结构的情况下增加新的操作。在Java中,结合动态绑定和静态绑定的概念,访问者模式可以帮助我们更好地处理复杂对象结构的遍历和操作。动态绑定提供了多态性...

    一个Delphi分派程序演示

    在这个"一个Delphi分派程序演示"中,我们将深入探讨Delphi中的分派机制,这是面向对象编程中的一个重要概念。 分派(Dispatch)是面向对象程序设计中的核心机制之一,它涉及到消息的传递和处理。在Delphi中,当我们...

    java设计模式

    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模式)

    **typescript例子-异步方法分派(AMD模式)** AMD(Asynchronous Module Definition)是一种JavaScript模块化开发的方式,尤其在处理大型项目时,它能够帮助我们有效地组织代码,实现异步加载。AMD模式由RequireJS...

    请求重定向个请求分派

    请求重定向和请求分派技术详解 请求重定向和请求分派是 MVC 架构中关键的技术,它们在 Web 应用程序中扮演着重要的角色。本文将详细介绍请求重定向和请求分派的概念、实现方法和应用场景。 一、请求重定向 请求...

    设计模式之行为模式 23种模式中的几种

    模板方法模式是行为类模式中的一种,使用继承机制在类间分派行为。 解释器模式是行为类模式中的一种,它将一个文法表示为一个类层次,并实现一个解释器作为这些类的实例上的一个操作。解释器模式也使用继承机制在类...

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码

    - **4.3 也谈double dispatch(双分派):: Visitor模式**:通过解释双分派的概念,进一步阐述了Visitor模式的工作原理及其优势。 - **4.4 为什么使用设计模式——从Singleton模式谈起**:通过分析Singleton模式的...

    C++设计模式精解

    7. 深入理解与实践:文档中提到作者也会在C++实现源码中深入解析State模式,探讨双分派在Visitor模式中的应用,以及为什么使用设计模式等,强调了实践和深入理解设计模式的重要性。 8. 学习过程的思考:作者将学习...

    设计模式 java 参考模式

    双分派语言如Java支持访问者模式,但并非必需,因为语言特性可以直接实现类似功能。 7. 中介者模式:中介者模式是用来降低多个对象之间的耦合度,它提供一个中介对象来协调各个对象的交互。相比观察者模式,中介者...

    深入浅出java设计模式(高清中文PDF)

    所涉及的设计模式包括工厂模式、单例模式、建造模式、原型模式、适配器模式、桥梁模式、组合模式、装饰模式、门面模式、享元模式、代理模式、责任链模式、命令模式、解释器模式、迭代器模式、调停者模式、备忘录模式...

    访问者模式简介和java代码实现

    为了解决这一问题,访问者模式可以采用双分派实现,即在元素类中也包含一个访问者类型参数,这样在访问者接口中只需要声明一个通用的 visit 方法,而元素类则根据自身类型决定调用哪个具体方法。 双分派的实现原理...

    设计模式-行为模式.pdf

    - **Visitor(访问者)**:访问者模式将一个操作作用于某个对象结构中的各个元素,它符合“双分派”原则。 - **Iterator(迭代器)**:迭代器模式提供了一种方法来顺序访问一个聚合对象中各个元素,而又不需要暴露该...

    访问者模式讨论篇:java的动态绑定与双分派

    java的动态绑定  所谓的动态绑定是指程执行期间(而不是在编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。java继承体系中的覆盖是动态绑定的,看一下如下的代码: class Father { ...

    C++版本设计模式

    而Visitor模式,也谈doubledispatch(双分派),这种模式可以在不改变已有对象结构的前提下增加新的操作。 总之,设计模式作为软件开发中的一种重要工具,不仅可以提高开发效率,还能使得代码结构更加清晰,易于扩展...

    彻底搞懂访问者模式的静态、动态和伪动态分派(csdn)————程序.pdf

    彻底搞懂访问者模式的静态、动态和伪动态分派(csdn)————程序

Global site tag (gtag.js) - Google Analytics