Ale*_* Dn 6 architecture design-patterns visitor-pattern
我使用Visitor设计模式来解决系统中的一个问题.作为参考如何实现它我使用DoFactory网站和这个YouTube视频.
在DoFactory示例中,访问者使用返回类型为"void"的方法,在YouTube视频中,作者使用"double".
为什么我问:
在向公司首席技术官提交解决方案之后,他接受称其为访客,但他声称如果访客不像GoF中所说的那样"无效",就像滥用真实的访客模式一样.
问题:
访客模式是否需要返回"无效"?
我的意思是为了成为"真实的访客模式",因为DoFactory(GoF)描述它,或者它可以是任何返回类型,仍然可以被称为"真实访客模式"?
dka*_*zel 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);
Run Code Online (Sandbox Code Playgroud)