Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 访客设计模式-返回类型_Design Patterns_Architecture_Visitor Pattern - Fatal编程技术网

Design patterns 访客设计模式-返回类型

Design patterns 访客设计模式-返回类型,design-patterns,architecture,visitor-pattern,Design Patterns,Architecture,Visitor Pattern,我使用访问者设计模式来解决系统中的一个问题。作为如何实现它的参考,我使用了和 在DoFactory示例中,访问者使用返回类型为“void”的方法,而在YouTube视频中,作者使用“double” 我为什么问: 在向公司CTO提出解决方案后,他同意称之为访问者,但他声称,如果访问者不是如中所述的“无效”,那么它就像滥用真实的访问者模式 问题: 访客模式是否需要返回“void”? 我的意思是,为了成为DoFactory(GoF)所描述的“真正的访问者模式”,或者它可以是任何返回类型,并且仍然可以被

我使用访问者设计模式来解决系统中的一个问题。作为如何实现它的参考,我使用了和

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

我为什么问:
在向公司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部分是玩笑,部分是真的,部分是你想要的,但是的,任何人都可以随心所欲,只要他们能够以正确的方式行事。