Design patterns 访客设计模式-返回类型
我使用访问者设计模式来解决系统中的一个问题。作为如何实现它的参考,我使用了和 在DoFactory示例中,访问者使用返回类型为“void”的方法,而在YouTube视频中,作者使用“double” 我为什么问:Design patterns 访客设计模式-返回类型,design-patterns,architecture,visitor-pattern,Design Patterns,Architecture,Visitor Pattern,我使用访问者设计模式来解决系统中的一个问题。作为如何实现它的参考,我使用了和 在DoFactory示例中,访问者使用返回类型为“void”的方法,而在YouTube视频中,作者使用“double” 我为什么问: 在向公司CTO提出解决方案后,他同意称之为访问者,但他声称,如果访问者不是如中所述的“无效”,那么它就像滥用真实的访问者模式 问题: 访客模式是否需要返回“void”? 我的意思是,为了成为DoFactory(GoF)所描述的“真正的访问者模式”,或者它可以是任何返回类型,并且仍然可以被
在向公司CTO提出解决方案后,他同意称之为访问者,但他声称,如果访问者不是如中所述的“无效”,那么它就像滥用真实的访问者模式 问题:
访客模式是否需要返回“void”?
我的意思是,为了成为DoFactory(GoF)所描述的“真正的访问者模式”,或者它可以是任何返回类型,并且仍然可以被称为“真正的访问者模式”?设计模式是用来指导如何解决常见的计算机科学问题的。欢迎您以任何方式偏离“真正”的实现 至于您的youtube视频示例,本文作者展示了如何使用访问者模式计算不同类型项目的税收。每个
visit
方法返回一个双倍的金额,包括每个项目将花费的税款。然后进行了不同的访问者实现,以展示如何在不更改代码的情况下使用不同的方法来计算税收(正常与免税期等)
这个例子是一个“玩具”问题,旨在以一种易于理解的方式教授访问者模式是如何工作的——它做得很好
虽然我说欢迎您偏离GoF实现,但模仿本视频中的代码可能不是一个好主意。
视频中有一些东西不适合在真实的程序中使用。例如,使用double
来赚钱。我认为双倍回报(为了钱)只是一种快速展示访客工作方式的方式,你可能不应该使用它
如果您想修改视频中的代码以返回void。最简单的解决方案是在TaxVisitor
中有一个私有字段,用于累积总值并在每个访问方法中递增。然后用一个getter得到最终的总数
作者还显式地调用了visitor示例中的每个食物项,这并没有显示visitor模式的强大功能。我会有一个可访问的杂货项目的容器对象,它的accept方法会访问收据中的每个项目
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);
如果能知道另一位作者选择返回
double
而不是nothing(void
)的原因,那就太好了;然后分析这些原因在此类上下文/场景中是否有效。大多数时候,谈论纯粹的这种或那种模式会适得其反。用最适合你的方式去使用它;不要太担心怎么称呼它。如果你称之为访客模式,大多数人仍然会同意并理解你所说的:首先,这是主要目标。让我们看看。。。定义“真实”。我写了一篇关于这一点的文章。简而言之,GoF设计模式书包含返回任意对象的示例代码。这在很大程度上没有被注意到,因为代码是在Smalltalk中,使用动态类型。C++示例代码必须使用空格,因为该语言的语义限制,而不是因为无效返回类型是访问者模式的中心特征。在Java中,我们可以以一种类型安全的方式对非void返回类型使用泛型。CTO不应该自己编写代码可能有一些原因,但我认为这是对高级工程师之间的任何设计/审查讨论中可能出现的特定设计模式的一个小误解。@Qw3ry部分是玩笑,部分是真的,部分是你想要的,但是的,任何人都可以随心所欲,只要他们能够以正确的方式行事。