Androidの観察者モードObserver
3207 ワード
転載は出典を明記してください.http://blog.csdn.net/feiduclear_up/articale/detail/42167487
観察者モード「オブジェクト間の1対以上の依存関係を定義し、1つのオブジェクトの状態が変化すると、そのオブジェクトに依存するすべてのオブジェクトが通知され、自動的に更新される」ということは、複数の観察者が観察者にメッセージを購読し、観察者が変化したときに、対応する観察者に自分のことを通知するということであると理解できる.Androidの観察者はObserverインターフェースを実現し、観察者はObservable類を継承する.使用手順は以下の通りです.
1.観察者DataWatchがObserverインターフェースを実現する.
2.被観察者DataChangeはObservable類を継承する.
3.観察者DataWatchは、観察者Data Changeにイベントを購読する(観察者DataWatchを観察者Data Changeに追加する).
4.観察者Data Changeデータに変更がありました.観察者Data Wathcerに対応するデータが変更されたことを通知します.対応する操作をしてください.
5.観察者DataWatherは、観察者Data Changeに購読イベントをキャンセルする(観察者DataWatchを観察者Data Changeから削除する).
コードの実装は以下の通りです.
1.観察者類
観察者モード「オブジェクト間の1対以上の依存関係を定義し、1つのオブジェクトの状態が変化すると、そのオブジェクトに依存するすべてのオブジェクトが通知され、自動的に更新される」ということは、複数の観察者が観察者にメッセージを購読し、観察者が変化したときに、対応する観察者に自分のことを通知するということであると理解できる.Androidの観察者はObserverインターフェースを実現し、観察者はObservable類を継承する.使用手順は以下の通りです.
1.観察者DataWatchがObserverインターフェースを実現する.
2.被観察者DataChangeはObservable類を継承する.
3.観察者DataWatchは、観察者Data Changeにイベントを購読する(観察者DataWatchを観察者Data Changeに追加する).
4.観察者Data Changeデータに変更がありました.観察者Data Wathcerに対応するデータが変更されたことを通知します.対応する操作をしてください.
5.観察者DataWatherは、観察者Data Changeに購読イベントをキャンセルする(観察者DataWatchを観察者Data Changeから削除する).
コードの実装は以下の通りです.
1.観察者類
package com.example.observer;
import java.util.Observable;
import java.util.Observer;
/**
* TODO< >
*
* @author xjp
* @data: 2014 12 26 9:29:56
* @version: V1.0
*/
public abstract class DataWatcher implements Observer {
@Override
public void update(Observable observable, Object data) {
}
}
2.観察者類package com.example.observer;
import java.util.Observable;
/**
* TODO< >
*
* @author xjp
* @data: 2014 12 26 9:30:21
* @version: V1.0
*/
public class DataChange extends Observable {
private static DataChange instance = null;
public static DataChange getInstance() {
if (null == instance) {
instance = new DataChange();
}
return instance;
}
public void notifyDataChange(Data data) {
// ?? 。
setChanged();
notifyObservers(data);
}
}
3.操作類package com.example.observer;
import java.util.Observable;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
private DataWatcher watcher = new DataWatcher() {
@Override
public void update(Observable observable, Object data) {
super.update(observable, data);
// , 。
Data mData = (Data)data;
Log.i("Test", "mData---->>"+mData.getDataChange());
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// , 。
Data mData = new Data();
mData.setDataChange(0);
DataChange.getInstance().notifyDataChange(mData);
}
@Override
protected void onResume() {
super.onResume();
// 。
DataChange.getInstance().addObserver(watcher);
}
@Override
protected void onPause() {
super.onPause();
//
DataChange.getInstance().deleteObserver(watcher);
}
}
4.データクラス:package com.example.observer;
/**
* TODO< >
*
* @author xjp
* @data: 2014 12 26 9:33:33
* @version: V1.0
*/
public class Data {
private int dataChange;
public Data() {
}
public int getDataChange() {
return dataChange;
}
public void setDataChange(int dataChange) {
this.dataChange = dataChange;
}
}
注意:私は主にAndroidの中で観察者のモードコードの1つの枠組みを実現するので、具体的にコードを書くには実際の業務を見なければなりません.実はプログラミングの最も主要な思想はフレームワークの実現です.