2011-10-27 10 views
0

これは私がシングルトンとオブザーバーに触発されているが、実際にはどちらも問題に取り組んできたコードです。これは他のパターンですか、それともちょうどmuttですか?このコンテキストは、複数のアクティビティオブジェクトが特定のアカウントに関連付けられているオブジェクトに関心を持つAndroidアプリです。最初のアクティビティが登録されたときにデータをロードし、オブザーバがなくなるとデータを一度転送します。これはObserverパターンなのでしょうか?

たとえば、クラス変数とメソッドを使用してこれらのオブジェクトやオブザーバを管理することは恐ろしい考えですか?どんなフィードバックでも歓迎です。

この質問は、オブザーバーに登録しているオブジェクトがすでに存在するかどうかをオブザーバーにいつ通知するかについての質問として開始されました。私が質問をタイプしていたとき、純粋なObserver ObservableのObservable であり、興味深いのは静的メソッドが関与していないことに気付きました。

public class MyObserver{ 
    public MyObserver(String id){ 
     MyObservable.addObserver(this, id); 
    } 

    public void update(MyObservable myObservable){ 
     ... do something with myObservable ... 
      ... maybe based on myObservable.id ... 
    } 
} 

public class MyObservable{ 

    /********************************* 
    * Object management static code * 
    *********************************/ 
    private static Map<String,Set<MyObserver>> observers; 
    static{ 
     observers = new Map<String,Set<MyObserver>>(); 
    } 

    private static Map<String,MyObservable> instances; 
    static{ 
     instances = new HashMap<String,MyObservable>(); 
    } 

    private static void addObserver(MyObserver myObserver, String id){ 
     Set<MyObserver> myObservers = observers.get(id); 
     if(myObservers==null){ 
      myObservers = new Set<MyObserver>(); 
      observers.put(myObservers); 
     } 
     myObservers.add(id); 

     MyObservable instance = instances.get(id); 
     if(instance!=null){ 
      myObserver.update(instance); 
     } else { 
      loadData(id); 
     } 
    } 

    private static void removeObserver(MyObserver myObserver, String id){ 
     Set<MyObserver> myObservers = observers.get(id); 
     if(myObservers!=null){ 
      myObservers.remove(myObserver); 
      if(myObservers.isEmpty()){ 
       instances.remove(id); 
      } 
     } 
    } 

    private static void loadData(String id){ 
     MyObservable myObservable = ... asynchronous code to load myObservable ... 
     ... callback will call MyObservable.set(id, myObservable); ... 
    } 

    private static void set(MyObservable myObservable){ 
     String id=myObservable.getId(); 
     instances.put(id, myObservable); 
     Set<MyObserver> myObservers = observers.get(id); 
     if(myObservers!=null){  
      for(MyObserver myObserver:myObservers){ 
       myObserver.update(myObservable); 
      }  
     } 
    } 

    /********************************************** 
    * Data Object instance variables and methods * 
    **********************************************/ 
    public MyObservable(String id){ 
     myId=id; 
    } 

    private string myId; 
    private String myData1; 
    private String myData2; 
    private String myData3; 
    ... getters and setters ... 

} 
+2

大雑把に言えば、私はあなたの統計量の過剰使用に満足できません。 –

+0

いくつかの統計の使用にコメントしています。私はそれが扱われるようにそれらを使用するための私の理由を与えたいと思います。アイデアは、クラスが独自のオブジェクトを管理することです。シングルトンのパターンとよく似ています。もちろん、1つのインスタンスの合計を保持します。この場合、IDパラメータがあるため、ただ1つではなくインスタンスのマップがあります。Observableの各インスタンスはオブザーバの独自のマップを持つことができましたが、各オブジェクトを元の目的に沿わせ、すべてのオブジェクト*管理タスクをクラスに残したかったのです。 – UFL1138

答えて

2

どのように実装しなければならないかについては、オブザーバーパターンには何も言われていません。それは、誰が視聴しているのか、誰が視聴されているのかということです。実装では複数のパターンを使用することはできません。

オブジェクトライフサイクルがでなければ、を慎重に管理しないと、もう誰も気にしないオブジェクトへの参照が多くなることになります。

+0

Dave、コメントありがとう。ライフサイクルを非常に慎重に管理しなければならないことについて私はあなたに同意します。この実装は、通常のObserverパターンでは不可能な問題を提起していると思いますか? FWIW私のアクティビティはonStartメソッドに登録され、onStopの登録を解除します。あなたはまた、私が遅れて地図を初期化し、空の時にそれらを削除するべきだと思いますか? – UFL1138

+0

私は地図管理は大したことではないと思います。地図が "消えて"いるはずのものへの参照を保持していない限り(おそらく)重要ではありません。インプラントが他のものより優れているか悪いのか分からないので、私は考える必要があります。思考は難しいです。 –

0

それはSingletonObserverです。

グローバルイベントハンドラは、このように動作します。スイング内の任意のキーイベントのリスナーを登録します。

メモリーリークを防ぐため、オブザーバーを慎重に追加および削除してください。

1

Javaでは、イディオムは「リスナー」を使用することです。 XListenerというインターフェースが必要です。それはあなたの更新メソッドのようなものを定義します。次に、方法addXListener(Xlistener)removeXListener(XListener)で観測値を取得します。彼らは通知されるリスナのList(not set)を維持します。観察可能なオブジェクトは、同じリスナーを複数回持つことができます。静的なものはありません。 java.beans.PropertyChangeSupportjava.beans.PropertyChangeListenerをチェックしてください。あなたが持っているものと

二つの主な問題は、次のとおりです。

  1. 観測可能で静的なもの。静的な理由そのクラスのオブザーバブルオブジェクトが1つだけ必要な場合は、シングルトンパターンを使用できます。しかし、代わりに依存関係注入を使うべきです。
  2. ObservableとObserverの強い結合。 XListenerインターフェイスは、あなたが持っているオブザーバブルについては、 は知らないはずです。それ以外の場合は、 は循環依存関係を導入し、実装ではなくインタフェースをプログラミングすることがなくなりました( )。
+0

JavaにはObserverインターフェースとObservableクラスがあり、 "Listener"イディオムには含まれていません。そうでなければ、私はこのすべてに同意します。 –