具有两个方法参数的访客模式



我有一个类MethodClass和类FooBar,它们都扩展了FooBar。MethodClass 有一个包含FooBar对象的列表,以及一个从此列表中选择两个随机元素并将它们传递给doMethod(FooBar fooBar1, FooBar fooBar2)的方法doMethod()doMethod(FooBar fooBar1, FooBar fooBar2)的结果取决于给定参数的子类。

到目前为止的结构:

方法类:

List<Foobar> list;
void doMethod() {
FooBar obj1 = ...;
FooBar obj2 = ...;
doMethod(obj1,obj2);
void doMethod(FooBar fooBar1, FooBar fooBar2) {
//instance checking and downcasting
...
}
void doMethod(Foo foo1, Foo foo2) {
foo1.doA();
foo2.doA();
}
void doMethod(Foo foo, Bar bar) {
foo.doB();
bar.doB();
}
void doMethod(Bar bar1, Bar bar2) {
bar1.doA();
bar2.doA();
}

抽象类 FooBar:

public abstract class FooBar {
abstract void methodA() {...}
abstract void methodB() {...}
}

福类:

public class Foo extends FooBar {
void methodB() {...}
void methodB() {...}
}

类栏:

public class Foo extends FooBar {
void methodA() {...}
void methodB() {...}
}

我将在未来进一步扩展FooBar(子类将只有methodAmethodB(。是否可以在不进行 donwcast 的情况下实现这一点,并且在向FooBar添加子类时无需更新多个类?如果doMethod只接受一个参数,那么使用访问者模式的变体可以轻松完成此操作,但我找不到将其扩展到两个参数的适当方法。

提前谢谢。

我将在未来进一步扩展FooBar。

因此,访客模式不是最佳选择,因为它旨在定义新操作而不更改模型,而不是相反。

此外,实际上您根据参数的特定子类调用不同的方法,例如:

void doMethod(Foo foo1, Foo foo2) {
foo1.doA();
foo2.doA();
}
void doMethod(Foo foo, Bar bar) {
foo.doB();
bar.doB();
}

这就像根据从列表中选择的元素的子类,您是否将执行不同的操作。 因此,多态性(访客模式的基础,也是大多数设计模式的基础(在这里将没有帮助。
若要从多态性中受益,应提供更高的抽象级别。

您的要求是广泛且非常抽象的。所以我不能给你更具体的指示,但无论如何,我认为你应该回顾整体设计,并关注子类定义的行为之间的一致性。

最新更新