访客模式说明

2024-05-03

因此,我已经阅读了有关访问者模式的所有文档,但我仍然非常困惑。我从另一个问题中获取了这个例子,有人可以帮助我理解吗?例如,我们什么时候使用访问者设计模式?我想我可能已经理解了一些,但我只是看不到更大的图景。我怎么知道什么时候可以使用它?

class equipmentVisited
{
  virtual void accept(equipmentVisitor* visitor) = 0;
}

class floppyDisk : public equipmentVisited
{
  virtual void accept(equipmentVisitor* visitor);
}

class processor : public equipmentVisited
{
  virtual void accept(equipmentVisitor* visitor);
}

class computer : public equipmentVisited
{
  virtual void accept(equipmentVisitor* visitor);
}

class equipmentVisitor
{
  virtual void visitFloppyDisk(floppyDisk* );
  virtual void visitProcessor(processor* );
  virtual void visitComputer(computer* );
}

// Some additional classes inheriting from equipmentVisitor would be here

equipmentVisited* visited;
equipmentVisitor* visitor;

// Here you initialise visited and visitor in any convenient way

visited->accept(visitor);

访问者模式用于实现双重调度 http://en.wikipedia.org/wiki/Double_dispatch。简而言之,这意味着执行的代码取决于两个对象的运行时类型。

当你打电话给常客时虚函数,它是一个单一的调度:执行的代码片段取决于单个对象的运行时类型,即您正在调用的虚拟方法。

对于访问者模式,被调用的方法最终取决于两个对象的类型 - 实现该方法的对象的类型equipmentVisitor,以及您调用的对象的类型accept(即equipmentVisited子类)。

在 C++ 中还有其他方法来实现双重调度。 Scott Meyer 的第 31 项“更有效的 C++” https://rads.stackoverflow.com/amzn/click/com/020163371X深入探讨这个主题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访客模式说明 的相关文章

随机推荐

  • 如何安排函数在 Qt for Python 的主 UI 线程上运行?

    我正在移植一个 Python GTK 应用程序 因此它使用 Qt for Python PySide2 它使用Python标准实现工作线程threading模块和工作线程使用Gdk threads add idle 与主 GUI 线程交互
  • Jetty9 - Jetty 不是从单独的 {jetty.base} 运行

    在启动 jetty9 服务器作为服务时 我看到以下警告 我对此一无所知 警告 oejs HomeBaseWarning main Jetty 的此实例不是从单独的 jetty base 目录运行 不建议这样做 请参阅文档 http www
  • Case 表达式在 SQL 查询中无法正常工作

    我想连接列supplier使用逗号分隔符创建表并将其放入名为 contact 的别名字段中 我使用过检查空值的案例 假设如果contact number2则为空contact number3将在别名字段中 反之亦然 这是我的查询 SELEC
  • 如何将html设置为extjs中的元素

    1 如何设置HTML到已经创建的面板或任何其他元素 我是初学者 我尝试了下面的方法来设置 HTML 中的一些内容 var clickedElement Ext getCmp id el child gt clickedElement set
  • “排序文件名 | uniq”不适用于大文件

    我可以从小文本文件中删除重复条目 但不能从大文本文件中删除重复条目 我有一个 4MB 的文件 文件的开头如下所示 aa aah aahed aahed aahing aahing aahs aahs aal aalii aalii aali
  • 可扩展性和弹性有什么区别?

    我听说很多人交替使用这两个术语 但在我看来 它们之间还是有区别的 可扩展性 的能力软件系统在其当前硬件资源上处理更大的工作负载 scale up 或当前和额外的硬件资源 向外扩展 应用程序服务不中断 弹性 的能力硬件层下面 通常是云基础设施
  • 在命令行上编译 C++/CX

    我收到链接器错误fatal error C1107 could not find assembly platform winmd please specify the assembly search path using AI or by
  • 尝试构建我的 CUDA 程序时出现错误 MSB4062

    当我尝试构建我的第一个 GPU 程序时 出现以下错误 有什么建议可能会出什么问题吗 错误 1 错误 MSB4062 Nvda Build CudaTasks SanitizePaths 任务 无法从程序集 C Program 加载 文件 M
  • 如何处理 Ipython Notebook 中的引用?

    在 Ipython Notebook 中处理引用的最佳方法是什么 理想情况下 我想要一个 bibtex 文件 然后像在 Latex 中一样 在 Ipython markdown 单元格中拥有一个速记列表 并在笔记本末尾提供完整的参考文献 我
  • 截断浮点数而不向上舍入

    我有一个浮点数 我想将其截断为 3 位 但我不想向上舍入 例如 转换1 0155555555555555 to 1 015 not 1 016 我将如何在 Ruby 中做到这一点 您还可以转换为 BigDecimal 并对其调用 trunc
  • 为应用程序创建了新的 WidgetKit 扩展:SwiftUI 预览不适用于“appex 必须位于应用程序中”

    我使用的是 macOS 12 6 上的 Xcode 14 0 1 我正在尝试使用 WidgetKit 在现有应用程序中创建一个新的手表复杂功能 首先向我的项目添加一个 Widget 扩展模板目标 这会生成一个新文件夹 其中包含意图定义文件
  • UI 引导轮播第一张幻灯片不显示,然后在最后一张幻灯片崩溃

    我正在尝试实现 ui bootstraps 轮播 但是当页面加载时 第一个图像不会显示 但控件和指示器会显示 然后 当第二个图像显示时 我可以使用控件返回到第一个图像 它将显示正常 我可以使用控件到达最后一张幻灯片或让它自动滑动 但是当我到
  • 将 stdout 和 stderr 捕获到不同的变量中

    是否可以存储或捕获 stdout 和 stderr不同的变量 不使用临时文件 现在我这样做是为了获得标准输出out和标准错误err跑步时some command 但我会 喜欢避免临时文件 error file mktemp out some
  • Android 应用程序开发 - 不带 Intent 直接发送电子邮件

    任何人都可以建议我如何在不使用意图或打开另一个 Android 应用程序的情况下发送电子邮件 我希望点击发送按钮后直接发送电子邮件 我必须使用特定的 Office365 电子邮件来发送消息 我应该使用一些 API 或 SMTP 等吗 有没有
  • 通过浅复制避免 List 上的 ConcurrentModificationException

    我有一堂课如下 class Test private LinkedList
  • 如何导入名称与我的包中的模块冲突的模块?

    我的目录中有几个 python 模块 在同一目录下 我有一个包tests 我很想将模块命名为tests与它们包含测试的模块相同 尽管这当然并不重要 So in tests foo我天真地写着import foo 这不太好用 它是导入的tes
  • 如何将 Pixel 2 连接到 ADB

    我有一台已解锁并启用了 USB 调试的 Pixel 2 然而 如果我将其插入计算机 它只会显示正在充电 USB 线可以连接其他设备进行数据传输 但没有问题 所以它不是线 我可以轻松地将任何其他设备连接到我的任何端口 甚至是原来的 Pixel
  • 在 CodeIgniter 中使用 ajax 时出现 403 禁止错误

    我正在显示我的名字textbox使用 ajax 自动完成 但我的 ajax URL 不起作用 每次都显示在网络选项卡中 403 禁止 我尝试过像这样的ajax URL url baseUrl index php Employee contr
  • C++中成员函数指针是如何实现的?

    C 中的成员函数指针分为三部分 Offset Address index virtual 当使用派生对象调用时 偏移量用于指针调整base pointer 这个抵消是如何实现的 它是否指向某个表 每个派生类都有一个表 并且该表包含以下形式的
  • 访客模式说明

    因此 我已经阅读了有关访问者模式的所有文档 但我仍然非常困惑 我从另一个问题中获取了这个例子 有人可以帮助我理解吗 例如 我们什么时候使用访问者设计模式 我想我可能已经理解了一些 但我只是看不到更大的图景 我怎么知道什么时候可以使用它 cl