0

Observerパターンに問題があります。
まず、サーバーからデータを取得するためのHttpHelperクラスがあり、これをObserverableとして使用しました。

 public class HttpHelper extends Observable,Runnable{
    public void run(){
      //do long task to get data
      String result = getData();
      setChanged();
      notifyObservers(result);
   }
 } 

DataManagerクラスは、完了するとHttpHerlperからデータを取得し、ビジネスタスクを実行します。

public class DataManager implements Observer {
    public void doTask(){
    HttpHelper helper = new HttpHelper();
    helper.addObserver(this); 
    Thread thread = new Thread(helper);
    thread.start();
    }
    public void update(Observable obj, Object data) {
       if (data instanceof String) {
         // do some stuff with this data
         // Then I want to notify the result to the view
         Model model = doSomething(data);
         notify(model)
       }
    }
}

最後に、Viewクラスは、DataManagerがタスクを完了するとデータを更新します。

  public class View{
       private void getData(){
           DataManager manager = new DataManager()
           manager.doTask();
       }
       public void update(Observable obj, Object data) {

       }
 }

オブザーバーをもう一度使用する必要がありますか?そして、どうすればそれを行うことができますか?
P / s:何らかの理由で、HttpHelperとDataManagerを分離する必要があります。
更新:クラス構造は次のとおりです https://www.dropbox.com/s/givn6vzvqr4cgye/bkd.png

4

2 に答える 2

1

IMO、HttpHelperとDataManagerの関係には、オブザーバーパターンは必要ありません。処理が完了したことをマネージャーに通知するための単なるコールバックのようです。オブザーバーは、単一のリスナーではなく、共通のインターフェースを介して複数の異なるリスナーにイベントをディスパッチするのに適しています。そうは言っても、あなたが持っているものはうまくいくでしょう。私のアドバイスに従いたい場合は、コールバックの実装に関するこの記事を確認してください

さて、マネージャーとビューの関係については、オブザーバーパターンを使用する必要があることに同意します。これにより、同じイベントに対して異なる反応を示すさまざまなビューを作成できます。これは、それDataManagerが拡張されるべきObservableであり、それを聞いているすべてのビューが実装されるべきであることを意味しますObserver

最後に、さまざまなタイプのイベントを計画している場合、JDKのオブザーバブルおよびオブザーバー(java.util)メカニズムはあまりクリーンではないことを言わなければなりません。私の最大の批判は、更新の2番目の引数がであるということObjectです。そのため、例のようにチェックする必要がある場所の膨大なリストが作成さinstanceofれますが、これは一般的には適切な方法ではありませんEventObject別の方法は、UIクラス(およびなど)のイベント通知メカニズムを使用することですEventListener。これらはUIクラスの一部ですが、実際にはUIよりも一般的です。この他の質問を参照してください

ああ、できれば、カスケードイベントを避けるようにしてください。コードの読み取りとデバッグが困難になります。たぶん、ビューはHttpHelperを直接観察できますか?

于 2012-09-20T03:33:31.847 に答える
1

私はあなたが作ることができると思いますが、ViewそのObservable観察の連鎖はあなたのコードを複雑にするかもしれません。

私にもたらされた当面の解決策は次のとおりです。

オブザーバーコントローラーを作成する

class Controller implements Observer{
  DataManager dm;
  View v;

  void update(...){
      Data d = dm.getData();
      v.loadData(d);
  }
}

Controller観察してくださいHttpHelper

于 2012-09-20T03:36:59.107 に答える