2010-12-03 44 views
7

如果我有一个对象,我希望能够观察其他几个可观察对象,而不是所有相同类型的对象。例如,我希望A能够观察到B和C.B和C完全不相关,除了它们都实现Observable。在Java中避免instanceof运算符的同时观察多个观测值?

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

回答

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 
    } 
} 

这种方式可以为要观察每个类型添加一个方法

public void update(A a, Object arg); 
public void update(B b, Object arg); 
public void update(C c, Object arg); 

。不幸的是,你需要知道Observable的具体类型。然而,你可以改变反射来允许接口等。

0

假设对象B/C上的操作是相同的,并且您只是想区分两个对象以实现状态杂耍目的,您还可以创建一个实现实际观察逻辑/状态的委托对象,并使用lookup机制在主要对象中检索特定Observable对象的正确委托。然后转发呼叫。

0

您的监听器中始终有一个Map<Class<? extends Event>, EventHandler>。类似的,但没有明确的'instanceof'操作符。它将在地图中替换为containsKey()

12

干净的解决方案是使用(匿名)内部类在A作为Observer s。例如:

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 
    } 
} 

这将让你BObserver/CObserver实例添加到然而,许多B S和C是你真正想要观看。它具有额外的好处,即A的公共接口不那么混乱,您可以轻松添加新的内部类来处理类D,EF

+3

几乎可以肯定你想让你的内部类匿名。 – 2010-12-04 01:20:06

相关问题