我使用“访客”设计模式来解决系统中的问题之一。作为引用,我使用DoFactory siteThis YouTube video

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

为什么问:
向公司CTO提出解决方案后,他接受了将其称为“访客”的说法,但是他声称,就像GoF中所说的那样,访客不是“无效”的,而是喜欢滥用实际的访客模式。

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

最佳答案

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

对于您的youtube视频示例,该视频的作者向您展示了如何使用访问者模式来计算不同类型商品的税金。每个visit方法返回的金额为双倍,包括每件商品将要花费的税款。然后进行了不同的Visitor实现,以展示如何在不更改代码的情况下可以有不同的方法来计算税金(正常与免税期等)。

该示例是一个“玩具”问题,旨在教您如何以一种易于理解的方式来访问访客模式,并且它做得很好。

虽然我说欢迎您偏离GoF实现,但模仿此视频中的代码可能不是一个好主意。
视频中有几件事在实际程序中使用时是个坏主意。例如,使用double赚钱。我认为双倍的返回(金钱)只是快速显示访客工作方式的一种方式,您可能不应该使用它。

如果您想修改视频中的代码以返回void。最简单的解决方案是在TaxVisitor中有一个私有(private)字段,用于累积总值并在每种访问方法内将其增加。然后用 setter/getter 得到最终总量。

作者还在其访问者示例中显式调用了每个食品,但没有显示出访问者模式的强大功能。我本来有一个可以访问的杂 cargo 品的容器对象,它的接受方法将访问收据中的每个物品。

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);

关于design-patterns - 访客设计模式-返回类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29593091/

10-10 18:57