访问者设计模式 - return 类型

Visitor Design Pattern - return type

我使用访客设计模式解决了我们系统中的一个问题。作为如何实现它的参考,我使用了 DoFactory site and This YouTube video.

在 DoFactory 示例中,访问者使用 return 类型 "void" 的方法,在 YouTube 视频中,作者使用 "double".

为什么问:
在向公司 CTO 介绍解决方案后,他同意将其称为 Visitor,但他声称如果 Visitor 不是 GoF 中所述的 "void",那么它就像滥用真正的 Visitor 模式。

问题:
访客模式是否需要 return "void"?
我的意思是为了成为 DoFactory (GoF) 描述的 "real Visitor pattern",或者它可以是任何 return 类型并且仍然可以称为 "real Visitor pattern"?

设计模式旨在用作说明如何解决常见计算机科学问题的指南。欢迎您以任何您希望的方式偏离 "real" 实施。

关于您的示例 youtube 视频,该视频的作者展示了如何使用访问者模式来计算不同类型商品的税收。每种 visit 方法 return 将每件商品的含税金额翻倍。然后进行了不同的访问者实现,以展示如何在不更改代码的情况下使用不同的方法来计算税收(正常与免税期等)。

这个例子是一个 "toy" 问题,旨在以一种易于理解的方式教授访客模式是如何工作的 - 它做得很好。

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

如果您想将视频中的代码修改为return无效。最简单的解决方案是在 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);