访客设计模式 - 返回类型

时间:2015-04-12 18:36:50

标签: design-patterns architecture visitor-pattern

我使用Visitor设计模式来解决系统中的一个问题。作为参考如何实现它,我使用了DoFactory siteThis YouTube video

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

为什么我要问:
在向公司首席技术官提交解决方案后,他接受称其为访客,但他声称,如果游客不是像GoF所说的那样“无效”,而是滥用真实的访客模式。

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

1 个答案:

答案 0 :(得分:10)

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

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

这个例子是一个“玩具”问题,旨在教导访客模式如何以易于理解的方式运作 - 并且它做得很好。

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

如果您想修改视频中的代码而不是返回void。最简单的解决方案是在TaxVisitor中有一个私有字段,它会累积总值并在每个访问方法中增加它。然后有一个吸气剂来获得最终的总数。

作者还明确地调用了他的访客示例中的每个食物项目,这些食物项目没有显示访客模式的力量。我会有一个可以访问的杂货物品的容器对象,它的接受方法将访问收据中的每个项目。

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