访问者模式有两个方法参数

时间:2018-05-18 16:48:52

标签: java oop

我有一个课程MethodClass,课程FooBar都延伸FooBar。 MethodClass有一个包含FooBar对象的列表,以及一个方法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(子类只有methodAmethodB)。是否有可能在没有弃儿的情况下实现这一点,并且在向FooBar添加子类时无需更新多个类?如果doMethod仅使用一个参数,则可以使用访问者模式的变体轻松完成,但我找不到将其扩展为两个参数的正确方法。

提前致谢。

1 个答案:

答案 0 :(得分:0)

  

我将来会进一步扩展FooBar。

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

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

void doMethod(Foo foo1, Foo foo2) {
    foo1.doA();
    foo2.doA();
}

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

就像根据从列表中选取的元素的子类一样,您将执行不同的操作。 因此,多态性(访问者模式的基础以及大多数设计模式)在这里都没有用 要从多态性中受益,您应该提供更高的抽象级别。

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