自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android設計模式系列--觀察者模式

移動開發(fā) Android
觀察者模式,Observer Pattern,是一個很實用的模式,本人曾經(jīng)接觸到的各種平臺以及曾經(jīng)參與項目中打印模板解釋器中都用到了此模式。

觀察者模式,是一種非常常見的設計模式,在很多系統(tǒng)中隨處可見,尤其是涉及到數(shù)據(jù)狀態(tài)發(fā)生變化需要通知的情況下。
本文以AbstractCursor為例子,展開分析。
觀察者模式,Observer Pattern,是一個很實用的模式,本人曾經(jīng)接觸到的各種平臺以及曾經(jīng)參與項目中打印模板解釋器中都用到了此模式。

1.意圖
定義對象間的一種一對多的依賴關系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。
熱門詞匯:依賴 發(fā)布-訂閱 事件 通知 更新 監(jiān)聽 

2.結(jié)構(gòu)


這是一個最簡單的觀察者模式,目標對象能夠添加和刪除觀察者,當自己某種狀態(tài)或者行為發(fā)生改變時,可通過notify通知注冊的觀察者進行更新操作。
分析AbstractCursor的具體情況,我們發(fā)現(xiàn)實際工作有時需要對觀察者進行統(tǒng)一管理,甚至觀察者類型有很多種而又可以分成幾個系列,這個時候是要復雜的多,通過合理的分層這個問題很好解決。下面根據(jù)具體情況,我們畫出android中abstractCurosr中用到的觀察者模式結(jié)構(gòu)圖:


觀察者分成了兩個系列。

3.代碼
列舉其中相關核心代碼如下:

  1. public abstract class AbstractCursor {  
  2.     //定義管理器  
  3.     DataSetObservable mDataSetObservable = new DataSetObservable();  
  4.     ContentObservable mContentObservable = new ContentObservable();  
  5.        
  6.     //注冊和卸載兩類觀察者  
  7.     public void registerContentObserver(ContentObserver observer) {  
  8.         mContentObservable.registerObserver(observer);  
  9.     }  
  10.    
  11.     public void unregisterContentObserver(ContentObserver observer) {  
  12.         // cursor will unregister all observers when it close  
  13.         if (!mClosed) {  
  14.             mContentObservable.unregisterObserver(observer);  
  15.         }  
  16.     }  
  17.    
  18.     public void registerDataSetObserver(DataSetObserver observer) {  
  19.         mDataSetObservable.registerObserver(observer);  
  20.            
  21.     }  
  22.    
  23.     public void unregisterDataSetObserver(DataSetObserver observer) {  
  24.         mDataSetObservable.unregisterObserver(observer);  
  25.     }  
  26.    
  27.     //2類通知方法  
  28.     protected void onChange(boolean selfChange) {  
  29.         synchronized (mSelfObserverLock) {  
  30.             mContentObservable.dispatchChange(selfChange);  
  31.             if (mNotifyUri != null && selfChange) {  
  32.                 mContentResolver.notifyChange(mNotifyUri, mSelfObserver);  
  33.             }  
  34.         }  
  35.     }  
  36.    
  37.     protected void notifyDataSetChange() {  
  38.         mDataSetObservable.notifyChanged();  
  39.     }  
  40. }  

再看看Observable<T>類和DataSetObservable類:

  1. public abstract class Observable<T> {  
  2.     /**  
  3.      * 觀察者列表  
  4.      */ 
  5.     protected final ArrayList<T> mObservers = new ArrayList<T>();  
  6.    
  7.     public void registerObserver(T observer) {  
  8.         if (observer == null) {  
  9.             throw new IllegalArgumentException("The observer is null.");  
  10.         }  
  11.         synchronized(mObservers) {  
  12.             if (mObservers.contains(observer)) {  
  13.                 throw new IllegalStateException("Observer " + observer + " is already registered.");  
  14.             }  
  15.             mObservers.add(observer);  
  16.         }  
  17.     }  
  18.    
  19.    
  20.     public void unregisterObserver(T observer) {  
  21.         if (observer == null) {  
  22.             throw new IllegalArgumentException("The observer is null.");  
  23.         }  
  24.         synchronized(mObservers) {  
  25.             int index = mObservers.indexOf(observer);  
  26.             if (index == -1) {  
  27.                 throw new IllegalStateException("Observer " + observer + " was not registered.");  
  28.             }  
  29.             mObservers.remove(index);  
  30.         }  
  31.     }  
  32.        
  33.     public void unregisterAll() {  
  34.         synchronized(mObservers) {  
  35.             mObservers.clear();  
  36.         }          
  37.     }  
  38. }  

  1. public class DataSetObservable extends Observable<DataSetObserver> {  
  2.     /**  
  3.      * 數(shù)據(jù)發(fā)生變化時,通知所有的觀察者  
  4.      */ 
  5.     public void notifyChanged() {  
  6.         synchronized(mObservers) {  
  7.             for (DataSetObserver observer : mObservers) {  
  8.                 observer.onChanged();  
  9.             }  
  10.         }  
  11.     }  
  12.     //... ... (其他方法)  
  13. }  

觀察者DataSetObserver類是一個抽象類:

  1. public abstract class DataSetObserver {  
  2.     public void onChanged() {  
  3.         // Do nothing  
  4.     }  
  5. }  

所以我們具體看它的子類:

  1. public class AlphabetIndexer extends DataSetObserver{  
  2.     /*  
  3.      * @hide 被android系統(tǒng)隱藏起來了  
  4.      */ 
  5.     @Override 
  6.     public void onChanged() {  
  7.         //觀察到數(shù)據(jù)變化,觀察者做自己該做的事情  
  8.         super.onChanged();  
  9.         mAlphaMap.clear();  
  10.     }  
  11. }  

ContentObserver也是類似。

4.效果
(1).行為型模式
(2).目標和觀察者間的抽象耦合(經(jīng)典實現(xiàn))。
(3).支持廣播通信(相信這點android開發(fā)者看到后應該有啟發(fā)吧)。
(4).注意意外的更新,這也是觀察者更新進行管理的原因之一。

責任編輯:張葉青 來源: 博客園
相關推薦

2020-10-26 08:45:39

觀察者模式

2021-07-08 11:28:43

觀察者模式設計

2022-01-29 22:12:35

前端模式觀察者

2015-11-25 11:10:45

Javascript設計觀察

2024-02-18 12:36:09

2021-09-06 10:04:47

觀察者模式應用

2009-03-30 09:39:04

觀察者思想換位設計模式

2024-06-04 13:11:52

Python行為設計模式開發(fā)

2011-04-29 09:22:22

2012-08-27 10:52:20

.NET架構(gòu)觀察者模式

2021-03-29 07:14:28

Spring觀察者模式

2021-01-25 05:38:04

設計原理VueSubject

2024-12-03 09:34:35

觀察者模 式編程Javav

2020-10-20 13:33:00

建造者模式

2020-11-05 09:38:07

中介者模式

2021-10-26 00:21:19

設計模式建造者

2022-05-09 10:50:13

觀察者模式設計模式

2021-01-21 05:34:14

設計模式建造者

2021-06-03 12:26:28

觀察者模式面試阿里P6

2021-09-29 19:45:24

觀察者模式Observable
點贊
收藏

51CTO技術棧公眾號