高尔夫游戏使用访客模式,为什么在这种情况下不是一个好主意?

时间:2018-07-14 08:07:51

标签: design-patterns visitor-pattern

  • 您正在编写高尔夫游戏,并且试图模拟高尔夫球场中点到点的滚动。
  • 您的伙伴建议您使用Visitor pattern,因为球会“访问”每个点。
  • 这样,它对于沙子,微丘,粗糙,树木,水等可能会有不同的行为。
  • 他喜欢BallMovementVisitor这个名字。解释为什么这是一个坏主意

1 个答案:

答案 0 :(得分:0)

好坏是一种选择。

我个人不喜欢在这里使用访客模式的想法。

如果我们重新访问here中的访问者示例,则访问者模式只是基于方法重载来定向方法调用。

interface Visitor {
    void visit(FOO foo);
    void visit(BAR bar);
    void visit(BAZ baz);
}

如果我们在您的示例中使用它,我发现的唯一方便的方法是根据不同的环境类型使用重载。即

  • FOO =>沙子
  • Bar => ShillHill等

您可以通过这种方式开展业务。但是相反地,存在一些明显的缺点。

在定义添加新环境类型的需求时,您需要在访问者接口/类中继续添加不同的重载方法。如果您从solid principles的角度看,那是在违反OCP [虽然这是一种选择,而不是教条。 :)]。

对我来说,更体面的方法是使用strategycommand模式。