我有一个课程MethodClass
,课程Foo
和Bar
都延伸FooBar
。 MethodClass有一个包含Foo
和Bar
对象的列表,以及一个方法doMethod()
,它从该列表中选取两个随机元素并将它们传递给doMethod(FooBar fooBar1, FooBar fooBar2)
。 doMethod(FooBar fooBar1, FooBar fooBar2)
的结果取决于给定参数的子类。
迄今为止的结构:
Class MethodClass:
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() {...}
}
Class Foo:
public class Foo extends FooBar {
void methodB() {...}
void methodB() {...}
}
班级栏:
public class Foo extends FooBar {
void methodA() {...}
void methodB() {...}
}
我将来会进一步扩展FooBar
(子类只有methodA
和methodB
)。是否有可能在没有弃儿的情况下实现这一点,并且在向FooBar
添加子类时无需更新多个类?如果doMethod
仅使用一个参数,则可以使用访问者模式的变体轻松完成,但我找不到将其扩展为两个参数的正确方法。
提前致谢。
答案 0 :(得分:0)
我将来会进一步扩展FooBar。
因此访客模式不是最佳选择,因为它旨在定义新操作而不改变模型而不是相反。
此外,实际上您根据参数的特定子类调用不同的方法,例如:
void doMethod(Foo foo1, Foo foo2) {
foo1.doA();
foo2.doA();
}
void doMethod(Foo foo, Bar bar) {
foo.doB();
bar.doB();
}
就像根据从列表中选取的元素的子类一样,您将执行不同的操作。 因此,多态性(访问者模式的基础以及大多数设计模式)在这里都没有用 要从多态性中受益,您应该提供更高的抽象级别。
您的要求广泛而且非常抽象。所以我不能给你更具体的指示,但无论如何我认为你应该审查整体设计,并关注子类定义的行为之间的一致性。