访客设计模式-返回类型

2023-11-24

我使用访客设计模式来解决我们系统中的问题之一。作为如何实现它的参考,我使用了工厂现场 and 这个 YouTube 视频.

在 DoFactory 示例中,访问者使用返回类型为“void”的方法,而在 YouTube 视频中,作者使用“double”。

为什么我问:
在向公司 CTO 提出解决方案后,他同意将其称为“访客”,但他声称,如果“访客”不是如中所述“无效”GoF,而不是滥用真正的访客模式。

问题:
访问者模式是否需要返回“void”?
我的意思是为了成为 DoFactory (GoF) 所描述的“真正的访问者模式”,或者它可以是任何返回类型并且仍然可以称为“真正的访问者模式”?


设计模式旨在用作展示如何解决常见计算机科学问题的指南。欢迎您以任何您希望的方式偏离“真实”实现。

至于您的示例 YouTube 视频,该视频的作者展示了如何使用访客模式来计算不同类型项目的税费。每个visit方法返回双倍的金额,包括每件商品的税费。然后进行了不同的访问者实现,以展示如何在不更改代码的情况下采用不同的方式来计算税收(正常与免税期等)。

这个例子是一个“玩具”问题,旨在以一种易于理解的方式教授访问者模式如何工作——而且它做得很好。

虽然我说欢迎您偏离 GoF 实现,但模仿该视频中的代码可能不是一个好主意。 视频中的一些内容在实际程序中使用并不是一个好主意。例如使用double为了钱。我认为返回双倍(为了钱)只是快速显示访问者如何工作的一种方式,您可能不应该使用它。

如果您想修改视频中的代码以返回 void 。最简单的解决方案是在TaxVisitor累积总价值并在每个访问方法中增加它。然后有一个 getter 来获得最终的总数。

作者还在他的访客示例中明确调用了每个食物项目,但这并没有展示访客模式的强大功能。我会有一个可访问的杂货物品的容器对象,并且它的接受方法将访问收据中的每个物品。

GroceryList groceries = new GroceryList();

groceries.add(new Milk(...));
groceries.add(new Liquor(...));
   ...


 TaxVisitor visitor = new TaxVisitor();

 visitor.accept(groceries);


 Money tax = visitor.getTax();

 Money preTaxTotal = groceries.getTotalPreTax();

 Money total = preTaxTotal.plus(tax);

//or compute tax during tax holiday
TaxVisitor holidayVisitor = new TaxHolidayVisitor();
  holidayVisitor.accept(groceries);


 Money holidayTax = holidayVisitor.getTax();

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

访客设计模式-返回类型 的相关文章

  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • Java 枚举相对于旧的“类型安全枚举”模式的优势?

    在 JDK1 5 之前的 Java 中 Typesafe Enum 模式是实现只能采用有限数量值的类型的常用方法 public class Suit private final String name public static final
  • 使用面向对象的分析和设计对电梯进行建模[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 当涉及到面向对象的设计和分析时 有一组问题似乎在面试和课堂上很常见 这是其中之一 不幸的是 我在大学的 OOP 教授从未真正给出过答案 所以我一
  • 苹果、橙子和指向最派生的 C++ 类的指针

    假设我有一堆水果 class Fruit class Apple public Fruit class Orange public Fruit 以及一些作用于所述水果的多态函数 void Eat Fruit f Pesticide p vo
  • 进度状态报告模式

    我正在实现需要显示进程栏 或进度百分比 的长时间运行的进程 长时间运行的过程的整体逻辑很复杂 各种分页数据检索 因此 我最终在代码中的不同位置硬编码了大量百分比 在更新完成百分比时 什么被认为是最佳设计模式 我发现 JFace 周围使用的模
  • CISC 机器 - 它们不只是将复杂指令转换为 RISC 吗?

    也许我在架构上存在误解 但如果机器有 比如说 乘法指令 该指令是否未转换为更小的指令 或者过于复杂以至于最终与等效的 RISC 指令具有相同的速度 乘法是一个不好的例子 它在两种体系结构中都是一条指令 将上面的 乘法 替换为 CISC 中更
  • Struts ActionForm 属性应该是什么类型?

    我使用 Struts 1 2 4 继承了这个巨大的遗留 Java Web 应用程序 我有一个关于 ActionForms 的具体问题 其中一些仅具有字符串属性 即使对于数字 其中一些使用看似合适的类型 整数 日期 字符串等 这里的最佳实践是
  • 如何在Java中实现复合模式?

    我想实现一个复合模式Java以便绘制软件开发组织图 因此 我们假设有多个项目经理和多个开发人员 每个开发人员都被分配给一位项目经理 并且每个开发人员都能够使用各种编程语言进行编码 项目经理领导开发人员并准确了解他们的工作量 我对这个设计模式
  • 除了 Erlang 之外,还有哪些系统是基于“绿色流程”的?

    我正在阅读这个信息页面绿线 维基百科 http en wikipedia org wiki Green thread我想知道 除了 Erlang 之外 还有哪些编程系统依赖于 绿色进程 Edit 绿线 绿色流程 基于绿色流程 Erlang
  • 是否有任何库可以解析Java中的“数字表达式”,例如1,2-9,33-

    我不认为这很难 只是写起来很乏味 一些小的免费 如啤酒 库 我可以在其中放入像 1 2 9 33 这样的字符串 它可以告诉我给定的数字是否与该数字匹配表达 就像大多数程序的打印范围对话框一样 仅匹配奇数或偶数 或匹配每个 2 mod 5 或
  • Ruby 中实现的所有设计模式的备忘单?

    我想知道是否有针对 Ruby 中实现的所有设计模式的备忘单 这样您就不必重新发明轮子 设计模式对于组织大量代码非常有用 因为您不需要像在 verbose algol derivitive language 中那样编写那么多代码来在 ruby
  • 通过 Javascript 不断查询服务器 - 好主意吗?

    我有一个小型网站 大约有 5 到 10 名管理员 我已将其设置为监视每个管理员正在执行的操作 添加项目 删除项目等 我的管理面板中有一个列表 显示了集体管理部门之前执行的 10 项活动 今天 我决定每 30 秒进行一次自我更新 我的问题很简
  • Google BigQuery 底层架构

    所以我大约 10 分钟前才开始摆弄 Google BigQuery 我想知道是否有人知道他们用来存储数据的底层架构 例如 这只是他们自己的下一代 BigTable 基础设施吗 另外 他们在索引 索引重建等方面使用什么样的策略是否清楚 我只是
  • RESTful API:我应该在哪里编码我的工作流程?

    我正在开发一个 RESTful API 这是我的第一个 API 也是我的第一个真正大型的编码项目 因此 我仍在学习很多关于建筑等方面的知识 目前 我的 api 设置分为以下几层 HTTP层 资源层 领域模型 业务逻辑层 数据访问 存储层 持
  • gpg:抱歉,根本没有请求终端 - 无法获取输入

    解密时出现以下错误 eyaml decrypt s ENC and the key goes on here gnupg quiet no secmem warning no permission warning no tty yes de
  • 在事件聚合器中混合枚举与事件类

    我最近尝试实现自己的简单事件聚合器 我从 MSDN 上的事件聚合器文章中获得了很多灵感 关于 MSDN 上的事件聚合器 我注意到一件事是事件实际上是它们自己的类 这根本不是一件坏事 然而 我只是觉得总是为每个小事件创建一个新的空类很尴尬 我
  • 池和集群之间的区别

    从最纯粹的角度来看 它们感觉像是相同的概念 两者都管理资源 节点集并控制来自外部组件或由外部组件进行的访问 通过池 您可以向池借用这些资源 节点 也可以从池中归还这些资源 节点 对于集群 您在资源 节点前面有一个负载均衡器 并且您可以向负载
  • 这个单例能够抵抗序列化和反射攻击吗?

    以下代码是否能够抵抗序列化和反射攻击 public class Example private static Example instance new Example private Example public static Exampl
  • 实现 PHP 单例:静态类属性还是静态方法变量?

    所以 我总是像这样实现一个单例 class Singleton private static instance null public static function getInstance if self instance null se
  • SOA、客户端-服务器、Web 服务 - 有什么区别? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在阅读了一些有关 SOA Web 服务和客户端 服务器架构主题的文献之后 我真的对这些术语感到困惑 因为看不出它们之间的真正区别 有人

随机推荐

  • 如何修复我的包中的“.dist-info 目录未找到”?

    我有一个 Python 2 软件包 我正在尝试将其升级到 Python 3 它是由曾经在我现在所在的同一团队工作的某个人编写的 但他已不再在公司工作 不幸的是 没有人离开公司团队能够提供帮助 对包的文件运行 2to3 后 我运行python
  • R匹配2个以上条件并返回响应值

    您好 我有两个数据集 其中第一个是一组索引 ind1 lt rep c E W times 20 ind2 lt sample 100 150 40 y lt c 1 40 index lt data frame cbind ind1 in
  • 如果内存大小相等,如何将 C 结构体转换为另一种结构体类型?

    我有 2 个矩阵结构意味着相同的数据 但具有不同的形式 如下所示 Matrix type 1 typedef float Scalar typedef struct Scalar e 4 Vector typedef struct Vect
  • 该字符串未被识别为有效的日期时间。有一个从索引 0 开始的未知单词

    我有以下 C 在尝试将字符串解析为日期时间时出现上述错误 DateTime backupdate System Convert ToDateTime imageflowlabel Text DateTime currentdate Syst
  • gTTS直接输出

    我想让聊天机器人做出回应audio和文字 所有使用 gTTS 的示例代码似乎都需要 将文本保存到文件中 然后播放该文件 是否有另一种方法可以简化流程 例如使用 gTTS 自动播放 聊天机器人的响应 如果你简单地看一下the docs 您会看
  • 悬停时开始和暂停 SVG 动画

    当用户将鼠标悬停在以下 SVG 上时 我想对齿轮进行动画处理 也就是说 当鼠标进入时 两个齿轮都开始从它们停止的地方旋转 当鼠标离开时 齿轮会停止在它们所在的任何位置 如果可能的话 我希望动画使用缓入 缓出功能开始和结束 如何使用 SVG
  • 使用 sf 在 R 中求多边形的交集

    我想通过查看 400m 步行 5 分钟 内其他点的数量来评估每个点与其他等效点的空间接近程度 我在地图上有一些点 我可以在它们周围画一个简单的 400 m 缓冲区 我想确定哪些缓冲区重叠 然后计算重叠的数量 这个重叠数应该与原始点相关 这样
  • Tensorflow 跨设备通信

    正如tensorflow论文所述 Tensorflow的跨设备通信是通过在设备中添加 接收节点 和 发送节点 来实现的 根据我的理解 设备 请考虑仅涉及CPU设备 负责执行操作的计算 然而 数据 例如 操作产生的张量 变量缓冲区 驻留在内存
  • 无法使用 ServerSocket.socketBind 分配请求的地址

    当我尝试设置套接字服务器时 收到一条错误消息 Exception in thread main java net BindException Cannot assign requested address JVM Bind at java
  • 用户定义函数中的错误处理

    我想在 SQL Server 2005 中编写一个非 CLR 用户定义函数 该函数接受输入字符串并返回输出字符串 如果输入字符串无效 那么我想向调用者指示错误 我的第一个想法是使用 RAISERROR 来引发异常 但是 SQL Server
  • Core Data 中多语言数据的良好实践

    我的 iPhone 应用程序中需要一个多语言 coredata 数据库 我可以为每种语言创建不同的数据库 但我希望在 iphone sdk 中存在一种自动方式来管理不同语言核心数据中的数据 例如资源和字符串 有人有一些提示吗 我做了一些与
  • (405 Method Not allowed)响应 Google 代码提交期间的 MKACTIVITY

    我已将代码上传到 code google 并成功提交了两次 但现在当我尝试提交代码时 它总是给出 Server sent unexpected return value 405 Method Not Allowed in response
  • 如何在 Visual Basic 中声明全局变量?

    我想创建一个可以跨多种表单使用的变量 它将成为整数的临时存储位置 在 VB 中 有多种方法可以实现此目的 一种 VB 特定的方法和一种非 VB 特定的方法 即也可以在 C 中实现的方法 VB 特有的方法是创建一个模块并将变量放置在模块中 P
  • 为什么可以创建 COM 接口的新实例?

    我对 COM 和 coclass 没有太多背景 所以我不太明白为什么我可以使用new具有接口的操作员 从与语言 框架无关的角度来看 为什么它能正确编译和运行是令人困惑的 using Microsoft Office Interop Exce
  • intelliJ idea 10 社区版和 GWT 插件

    安装 GWT 插件遇到困难 尝试搜索 GWT 插件 我所能找到的只是 GWT Imagebundle 它已经非常过时了 尝试了 文件菜单 gt 配置插件 但没有帮助 因为插件尚未安装 intelliJ 10 社区版是否支持 GWT 插件 如
  • Angular2 - Http POST 请求参数

    我正在尝试发出 POST 请求 但无法使其正常工作 testRequest var body username myusername password mypassword var headers new Headers headers a
  • css3 webkit动画停止在div上:悬停

    我尝试使用 webkit animation 和 webkit keyframes 制作动画 我有一个 div 动画 里面有子 div 当我的鼠标位于孩子上方时 我会停止父母的 webkit 动画 有例子吗 Thanks 不幸的是CSS中没
  • Linux 上的 openSSL 证书验证 [关闭]

    Closed 这个问题是无关 目前不接受答案 JKJS 我有这个证书链 cert pem self signed gt cert pem gt cert pem 所有三个证书都是我生成的 任何地方都没有使用互联网连接 这是完美的离线工作 现
  • XSS 安全。来自同一域的 2 个 iframe 之间的通信

    域 abc com 有一个包含 2 个 iframe 的页面 它们都是从域 xyz com 加载的 XSS 安全性是否会阻止这两个 iframe 之间的 JavaScript 访问 通信 交互 嗯 这取决于你所说的沟通是什么意思 似乎某种类
  • 访客设计模式-返回类型

    我使用访客设计模式来解决我们系统中的问题之一 作为如何实现它的参考 我使用了工厂现场 and 这个 YouTube 视频 在 DoFactory 示例中 访问者使用返回类型为 void 的方法 而在 YouTube 视频中 作者使用 dou