【问题标题】:Visitor pattern with two method parameters具有两个方法参数的访问者模式
【发布时间】:2018-05-18 16:48:51
【问题描述】:

我有一个类 MethodClass 和类 FooBar,它们都扩展了 FooBar。 MethodClass 有一个包含FooBar 对象的列表和一个方法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(子类只有methodAmethodB)。在向FooBar 添加子类时,是否可以在不进行转换并且不需要更新多个类的情况下实现这一点?如果doMethod 只接受一个参数,这可以使用访问者模式的变体轻松完成,但我找不到将其扩展到两个参数的适当方法。

提前致谢。

【问题讨论】:

    标签: java oop


    【解决方案1】:

    我以后会进一步扩展 FooBar。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多