在java中避免使用instanceof运算符时观察多个observable?

sta*_*ext 7 java observer-pattern

如果我有一个对象,我希望能够观察其他几个可观察对象,而不是所有相同的类型.例如,我希望A能够观察B和C.B和C完全不相关,除了它们都实现了Observable.

显而易见的解决方案是在更新方法中使用"if instanceof",但很快就会变得混乱,因此我想知道是否还有其他方法?

Cam*_*ner 14

一个干净的解决方案是使用(匿名)内部类A来充当Observers.例如:

class A {
    public A(B b, C c) {
        b.addObserver(new BObserver());
        c.addObserver(new CObserver());
    }

    private class BObserver implements Observer {
        // Logic for updates on B in update method
    }

    private class CObserver implements Observer {
        // Logic for updates on C in update method
    }
}
Run Code Online (Sandbox Code Playgroud)

这将允许您将BObserver/ CObserver实例添加到您实际想要观看的许多Bs和Cs.它具有额外的好处,即A公共接口不那么混乱,您可以轻松地添加新的内部类来处理类D,E以及F.

  • 几乎可以肯定,你想让你的内心类匿名. (3认同)

Pet*_*rey 7

与之前的建议类似,您可以将更改更改为.

public void update(Observable o, Object arg) {
  try{
    Method update = getClass().getMethod(o.getClass(), Object.class);
    update.invoke(this, o, arg);
  } catch(Exception e) {
    // log exception
  }
}
Run Code Online (Sandbox Code Playgroud)

这样您就可以添加一个方法

public void update(A a, Object arg);
public void update(B b, Object arg);
public void update(C c, Object arg);
Run Code Online (Sandbox Code Playgroud)

对于您要观察的每种类型.不幸的是,您需要知道Observable的具体类型.但是,您可以更改反射以允许接口等.