高尔夫游戏使用访客模式,为什么在这种情况下是个坏主意?
Golf game use visitor pattern, why is it a bad idea in this situation?
- 您正在编写一个高尔夫游戏,并且您正在尝试模拟一个球在高尔夫球场上从一个点滚动到另一个点。
- 你的伙伴建议你使用
Visitor pattern
因为球“访问”了每个点。
- 这样它可以对沙子、小山、粗糙、树木、水等有不同的行为。
- 他喜欢这个名字
BallMovementVisitor
。解释为什么这是一个 坏主意?
好与坏是一种选择。
就我个人而言,我不喜欢在这里使用访问者模式。
如果我们重新访问 here 中的访问者示例,简单的访问者模式就是基于方法重载来指导方法调用。
interface Visitor {
void visit(FOO foo);
void visit(BAR bar);
void visit(BAZ baz);
}
如果我们将它用于您的示例,我能找到的唯一方便的方法是根据不同的环境类型使用重载。即
- FOO => 沙子
- 酒吧 => SlightHill 等
你可以用那种方式做你的生意。但反过来也有一些明显的缺点。
当定义添加新环境类型的要求时,您需要在访问者中不断添加不同的重载方法 interface/class。如果你从 solid principles 的角度来看,你就违反了 OCP [不过这是一个选择,而不是教条。 :)]。
- 您正在编写一个高尔夫游戏,并且您正在尝试模拟一个球在高尔夫球场上从一个点滚动到另一个点。
- 你的伙伴建议你使用
Visitor pattern
因为球“访问”了每个点。 - 这样它可以对沙子、小山、粗糙、树木、水等有不同的行为。
- 他喜欢这个名字
BallMovementVisitor
。解释为什么这是一个 坏主意?
好与坏是一种选择。
就我个人而言,我不喜欢在这里使用访问者模式。
如果我们重新访问 here 中的访问者示例,简单的访问者模式就是基于方法重载来指导方法调用。
interface Visitor {
void visit(FOO foo);
void visit(BAR bar);
void visit(BAZ baz);
}
如果我们将它用于您的示例,我能找到的唯一方便的方法是根据不同的环境类型使用重载。即
- FOO => 沙子
- 酒吧 => SlightHill 等
你可以用那种方式做你的生意。但反过来也有一些明显的缺点。
当定义添加新环境类型的要求时,您需要在访问者中不断添加不同的重载方法 interface/class。如果你从 solid principles 的角度来看,你就违反了 OCP [不过这是一个选择,而不是教条。 :)]。