我有一个类 MethodClass
以及类 Foo
和 Bar
,它们都扩展了 FooBar
。 MethodClass 有一个包含 Foo
和 Bar
对象的列表,以及一个方法 doMethod()
,该方法从该列表中随机选取两个元素并将它们传递给 doMethod(FooBar fooBar1, FooBar fooBar2)
。 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() {...}
}
Foo 类:
public class Foo extends FooBar {
void methodB() {...}
void methodB() {...}
}
类别栏:
public class Foo extends FooBar {
void methodA() {...}
void methodB() {...}
}
<小时/>
将来我会进一步扩展FooBar
(子类只有methodA
和methodB
)。在向 FooBar
添加子类时,是否可以在不向下转换且不需要更新多个类的情况下实现这一目标?如果 doMethod 仅采用一个参数,则可以使用访问者模式的变体轻松完成,但我找不到一种正确的方法将其扩展到两个参数。
提前致谢。
最佳答案
I will further extend FooBar in the future.
因此,访问者模式不是最佳选择,因为它旨在定义新操作而不更改模型,而不是相反。
此外,实际上您根据参数的特定子类调用不同的方法,例如:
void doMethod(Foo foo1, Foo foo2) {
foo1.doA();
foo2.doA();
}
void doMethod(Foo foo, Bar bar) {
foo.doB();
bar.doB();
}
这就像根据从列表中选取的元素的子类是否会执行不同的操作。
因此,多态性(访问者模式的基础,也是大多数设计模式的基础)在这里没有帮助。
为了从多态性中受益,您应该提供更高的抽象级别。
您的要求很广泛而且非常抽象。所以我无法给你更具体的指导,但无论如何我认为你应该审查整体设计并关注子类定义的行为之间的一致性。
关于java - 具有两个方法参数的访问者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50415964/