2010-12-03 11 views
7

私は、同じ種類のものではなく、いくつかの他の観察可能なオブジェクトを観察できるようにするオブジェクトを持っています。例えば、私はAがBとCを観察できるようにしたい.BとCは両方ともObservableを実装しているという事実を除いて、完全に無関係である。Javaでinstanceof演算子を避けながら複数の観測値を観測する?

明白な解決策は、更新メソッドの中で "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 
    } 
} 

この方法で、あなたが観察したいタイプごとに、1つの方法

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に対する操作が同じで、2つのオブジェクトを状態ジャグリングの目的で区別したいと仮定している場合は、実際の観測ロジック/状態を実装し、ルックアップを使用するデリゲートオブジェクトを作成することもできますメカニズムを使用して、特定のObservableオブジェクトの正しいデリゲートを取得します。その後、通話を転送します。

0

リスナーにはいつでもMap<Class<? extends Event>, EventHandler>を入れることができます。同様ですが、明示的な 'instanceof'演算子はありません。マップ内でcontainsKey()に置き換えられます。

12

Aの(匿名の)内部クラスを使用してObserverとして動作させることです。たとえば:

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

これは、あなたが実際に見たいB sおよびC秒しかし、多くのBObserver/CObserverインスタンスを追加することができます。 Aのパブリックインターフェイスの複雑さが軽減され、クラスD,EおよびFを処理する新しいクラスを簡単に追加できるという利点があります。

+3

ほとんどの場合、内部クラスを匿名にする必要があります。 –

+0

一般的にはyesですが、この例ではclassという名前では読みやすくなります。 –

関連する問題