我使用访客设计模式来解决我们系统中的问题之一。作为如何实现它的参考,我使用了工厂现场 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(使用前将#替换为@)