1. 程式人生 > 程式設計 >詳解Android觀察者模式的使用與優劣

詳解Android觀察者模式的使用與優劣

一、簡介

觀察者模式(又被稱為釋出-訂閱(Publish/Subscribe)模式,屬於行為型模式的一種,它定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件。這個主題物件在狀態變化時,會通知所有的觀察者物件,使他們能夠自動更新自己。該模式一個重要作用就是解耦,將被觀察者和觀察者進行解耦,使他們之間的依賴性更小

二、使用場景

關聯行為場景,需要注意的是關聯行為是可拆分的而不是“組合”關係
事件多級觸發場景
跨系統的訊息交換場景,如訊息佇列、事件匯流排的處理機制

三、簡單實現

這裡我們以微信公眾號的訂閱為例。公眾號當其更新內容時就會推送給訂閱了該公眾號的讀者。

 //被觀察者
 public class Wechat extends Observable{
  public void postNewPublication(String content){
   setChanged();
   notifyObservers(content);
  }
 }

 //觀察者
 public class Reader implements Observer{
  public String name ;

  public Reader(String name) {
   this.name = name;
  }

  @Override
  public void update(Observable o,Object arg) {
   Log.i(TAG,"update: wechat is update content is :"+arg);
  }
 }
 
 public void test(){
  Wechat wechat=new Wechat();
  
  Reader reader1=new Reader("reader1");
  Reader reader2=new Reader("reader2");
  Reader reader3=new Reader("reader3");
  
  wechat.addObserver(reader1);
  wechat.addObserver(reader2);
  wechat.addObserver(reader3);
  
  wechat.postNewPublication("up up up");
 }

這裡需要注意的是Observer和Observable是JDK內建的類,表示觀察者和被觀察者。

四、觀察者模式在Android中應用

ListView和RecycleView 的notifyDataSetChanged

當我們在使用ListView或RecycleView時如果資料發生變化我們會呼叫Adapter的notifyDataSetChanged()方法,如下所示

 public void notifyDataSetChanged() {
  mDataSetObservable.notifyChanged();
 }

在方法內部呼叫了mDataSetObservable.notifyChanged,這裡的mDataSetObservable是一個DataSetObservable例項

private final DataSetObservable mDataSetObservable = new DataSetObservable();

而DataSetObservable繼承自Observable,我們看下DataSetObservable的notifyChanged方法

public class DataSetObservable extends Observable<DataSetObserver> {

public void notifyChanged() {
  synchronized(mObservers) {
   for (int i = mObservers.size() - 1; i >= 0; i--) {
    mObservers.get(i).onChanged();
   }
  }
 }
 }

可以看到呼叫了DataSetObserver的onChanged方法,DataSetObserver是一個抽類這裡mObservers.get(i)獲得的是其子類AdapterDataSetObserver.

class AdapterDataSetObserver extends DataSetObserver {
  private Parcelable mInstanceState = null;
  @Override
  public void onChanged() {
   mDataChanged = true;
   mOldItemCount = mItemCount;
   mItemCount = getAdapter().getCount();
   if (AdapterView.this.getAdapter().hasStableIds() && mInstanceState != null
     && mOldItemCount == 0 && mItemCount > 0) {
    AdapterView.this.onRestoreInstanceState(mInstanceState);
    mInstanceState = null;
   } else {
    rememberSyncState();
   }
   checkFocus();
   //重新佈局
   requestLayout();
  }

  ...

  public void clearSavedState() {
   mInstanceState = null;
  }
 }

可以看到在AdapterDataSetObserver的onChanged方法中呼叫了requestLayout來進行重新佈局。

BroadcastReceiver

在Android中廣播也是基於觀察者模式的

五、小結

觀察者模式優點:

  • 解耦觀察者與被觀察者,應對業務變化
  • 增強系統靈活性、可擴充套件性

缺點:

在使用時要考慮開發效率和執行效率,程式中包括一個被觀察者、多個觀察者、開發除錯等內容會比較複雜,且Java中訊息通知預設是順序執行,如果一個觀察者卡頓,那麼會影響整體執行效率,在這種情況下一般考慮使用非同步的方式。

以上就是詳解Android觀察者模式的使用與優劣的詳細內容,更多關於Android 觀察者模式的資料請關注我們其它相關文章!