1. 程式人生 > >Android設計模式系列(2)--SDK原始碼之觀察者模式

Android設計模式系列(2)--SDK原始碼之觀察者模式

觀察者模式,是一種非常常見的設計模式,在很多系統中隨處可見,尤其是涉及到資料狀態發生變化需要通知的情況下。
本文以AbstractCursor為例子,展開分析。
觀察者模式,Observer Pattern,是一個很實用的模式,本人曾經接觸到的各種平臺以及曾經參與專案中列印模板直譯器中都用到了此模式。

1.意圖
定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。
熱門詞彙:依賴 釋出-訂閱 事件 通知 更新 監聽 

2.結構


這是一個最簡單的觀察者模式,目標物件能夠新增和刪除觀察者,當自己某種狀態或者行為發生改變時,可通過notify通知註冊的觀察者進行更新操作。
分 析AbstractCursor的具體情況,我們發現實際工作有時需要對觀察者進行統一管理,甚至觀察者型別有很多種而又可以分成幾個系列,這個時候是要 複雜的多,通過合理的分層這個問題很好解決。下面根據具體情況,我們畫出android中abstractCurosr中用到的觀察者模式結構圖:


觀察者分成了兩個系列。

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

public abstract class AbstractCursor {
    //定義管理器
    DataSetObservable mDataSetObservable = new DataSetObservable();
    ContentObservable mContentObservable = new ContentObservable();
     
    //註冊和解除安裝兩類觀察者
    public void registerContentObserver(ContentObserver observer) {
        mContentObservable.registerObserver(observer);
    }
 
    public void unregisterContentObserver(ContentObserver observer) {
        // cursor will unregister all observers when it close
        if (!mClosed) {
            mContentObservable.unregisterObserver(observer);
        }
    }
 
    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
         
    }
 
    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }
 
    //2類通知方法
    protected void onChange(boolean selfChange) {
        synchronized (mSelfObserverLock) {
            mContentObservable.dispatchChange(selfChange);
            if (mNotifyUri != null && selfChange) {
                mContentResolver.notifyChange(mNotifyUri, mSelfObserver);
            }
        }
    }
 
    protected void notifyDataSetChange() {
        mDataSetObservable.notifyChanged();
    }
}
 再看看Observable<T>類和DataSetObservable類:
public abstract class Observable<T> {
    /**
     * 觀察者列表
     */
    protected final ArrayList<T> mObservers = new ArrayList<T>();
 
    public void registerObserver(T observer) {
        if (observer == null) {
            throw new IllegalArgumentException("The observer is null.");
        }
        synchronized(mObservers) {
            if (mObservers.contains(observer)) {
                throw new IllegalStateException("Observer " + observer + " is already registered.");
            }
            mObservers.add(observer);
        }
    }
 
 
    public void unregisterObserver(T observer) {
        if (observer == null) {
            throw new IllegalArgumentException("The observer is null.");
        }
        synchronized(mObservers) {
            int index = mObservers.indexOf(observer);
            if (index == -1) {
                throw new IllegalStateException("Observer " + observer + " was not registered.");
            }
            mObservers.remove(index);
        }
    }
     
    public void unregisterAll() {
        synchronized(mObservers) {
            mObservers.clear();
        }       
    }
}
 

  和

public class DataSetObservable extends Observable<DataSetObserver> {
    /**
     * 資料發生變化時,通知所有的觀察者
     */
    public void notifyChanged() {
        synchronized(mObservers) {
            for (DataSetObserver observer : mObservers) {
                observer.onChanged();
            }
        }
    }
    //... ... (其他方法)
}

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

public abstract class DataSetObserver {
    public void onChanged() {
        // Do nothing
    }
}

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

public class AlphabetIndexer extends DataSetObserver{
    /*
     * @hide 被android系統隱藏起來了
     */
    @Override
    public void onChanged() {
        //觀察到資料變化,觀察者做自己該做的事情
        super.onChanged();
        mAlphaMap.clear();
    }
}

  ContentObserver也是類似。

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

本文轉自:謙虛的天下

相關推薦

Android設計模式系列(2)--SDK原始碼觀察模式

觀察者模式,是一種非常常見的設計模式,在很多系統中隨處可見,尤其是涉及到資料狀態發生變化需要通知的情況下。本文以AbstractCursor為例子,展開分析。觀察者模式,Observer Pattern,是一個很實用的模式,本人曾經接觸到的各種平臺以及曾經參與專案中列印模板直譯器中都用到了此模式。 1.意圖

Android設計模式系列(6)--SDK原始碼享元模式

享元模式,給我的感覺就是物件池,快取單例物件。java中的享元模式最經典的例子就是String類了,還有一個最容易理解的就是word文件字元共享的例子,也是享元模式的經典應用。本文對android中的sql編譯類SQLiteCompiledSql說明,展開分析,也是很容易理解的一個例子,其實,android

Android設計模式系列(3)--SDK原始碼單例模式

單例模式,可以說是GOF的23種設計模式中最簡單的一個。這個模式相對於其他幾個模式比較獨立,它只負責控制自己的例項化數量單一(而不是考慮為使用者產生什麼樣的例項),很有意思,是一個感覺上很乾淨的模式,本人很喜歡這個模式。android中很多地方都用到了單例模式,本文以輸入法管理者InputMethodMan

Java 設計模式系列(十六)觀察模式(Observer)

for out 其中 如果 observer 業務 ets 同時 hang Java 設計模式系列(十六)觀察者模式(Observer) 觀察者模式是對象的行為模式,又叫發布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監聽

rxJava 2.0入門觀察模式

前言 RxJava其實已經推出很久了,可以說是已經很火了,但是目前仍然還有相當一部分Android開發者沒有使用過,甚至說是想用,卻不知道怎麼用,或者不知道自己的專案哪裡可以用到,從本篇開始我們將以一些列文章逐步揭開rxJava神奇的面紗,從入門到實戰,讓你也可以輕鬆上手rxJava

Android設計模式學習觀察模式

蒐集的資料: http://blog.csdn.net/banketree/article/details/24985607  Android 設計模式 http://mobile.51cto.com/ahot-418968.htm  Android進階之大話設

研磨設計模式 觀察模式(Observer) 3——跟著cc學設計系列

12.3  模式講解 12.3.1  認識觀察者模式 (1)目標和觀察者之間的關係        按照模式的定義,目標和觀察者之間是典型的一對多的關係。        但是要注意,如果觀察者只有一個,也是可以的,這樣就變相實現了目標和觀察者之間一對一的關係,這也使得在處理一

大話設計模式觀察模式

arm eve his watermark observer cts 多個 放下 們的 從前,有個放羊娃。每天都去山上放羊,一天,他認為十分無聊。就想了個捉弄大家尋開心的主意。他向著山下正在種田的農夫們大聲喊:“狼來了!狼來了!救命啊!”農夫們聽到喊聲

設計模式觀察模式

觀察者模式 observer 監聽器的底層實現 observable 群發消息 轉發機制 1、觀察者模式的簡單介紹: a、核心: - 觀察者模式主要用於 1 : N 的通知中。當一個對象(目標對象 Subject 或者 Objservable )的狀態變化時,他需要及時告知

設計模式觀察模式詳解

http 通知 stat 發布-訂閱 () class arraylist nag .cn 觀察者模式又稱為發布-訂閱模式,涉及的角色有:   ●  抽象主題   ●  具體主題   ●  抽象觀察者   ●  具體觀察者 案例演示:公司發放工資的時候通知所有觀察者工資已發

23種設計模式觀察模式

主題 一個 server bsp 監聽 images 關系 .com 自動更新 觀察者模式(Observer):定義了一種一對多的關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。 23種設計模式之

GOF23設計模式觀察模式(observer)

hang 事件監聽器 rgs str arr public pda import lob 一、觀察者模式概述   觀察者模式主要用於 1 :N 的通知。當一個對象(目標對象 Subject 或 Observable)的狀態變化時,它需要通知一系列對象(觀察者對象 Obser

JAVA設計模式觀察模式

設計原則 設計模式 測試類 stat tin 正常 san date() 觀察者模式 轉載請註明出處:https://www.cnblogs.com/luohanguo/p/7825656.html 1、初步認識 觀察者模式的定義:   在對象之間定義了一對多的依賴

js 設計模式觀察模式

swe 有變 主題 頁面 ESS eache 不能 mov 學生類 觀察者模式 又被稱為“發布-訂閱”模式,目的是解決主題對象和觀察者之間功能的耦合性。發布者和訂閱者之間是互不幹擾的,沒有聯系的,通過觀察者,當做中介,將二者聯系起來。 例子:以學生和老師之間的為例 1.首先

Java 設計模式 觀察模式

float stock chan bject 17. sta chang eth int http://www.verejava.com/?id=16999149610674 package com.observer.theory; public class Test {

PHP 設計模式觀察模式

通知 更新 一對多 改變 變化 variable 它的 all 正常 觀察者模式定義對象的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新! 設計原則 在觀察者模式中,會改變的是主題的狀態以及觀察者的數目。用這個模式,你可以改變

C++設計模式觀察模式

圖片 .com attach mov pan rtu cts gin pda //觀察者模式 class Observer{ public: virtual void Updata() = 0; }; class Subject{ public: voi

設計模式的藝術 行為型模式觀察模式

前言 紅燈停,綠燈行,在日常的交通中,每每遇到紅燈,司機總是要在路口進行等待,等到綠燈才能通過,這個時候司機就扮演了一個觀察者的角色,隨著燈的顏色的變化,司機的行為也跟著變化,在軟體系統中,有些物件之間也存在類似交通訊號燈和汽車之間的關係,一個物件的的行為狀態改變導致了其他物件的狀態或行為也發生

java23中設計模式觀察模式

什麼叫觀察者模式? 當被觀察者的資料更新時,將會通知觀察該主題的所有觀察者。就像---微信公眾號就是被觀察者---關注該公眾號的就是觀察者---》 當公眾號更新文章時,關注的人就會獲得該資訊。這就是觀察者模式的應用。 用圖說明: 下面將用程式碼來解釋上面的內容: 1.觀

我的武林祕籍設計模式觀察模式

自從jack的鴨子游戲得到成功之後,jack的好朋友夏流就覺得心裡癢癢的,也想做出一番作為來。 所以,今天的主人公就是這位夏流童鞋。夏流是錢塘江觀測站的一名觀測員,需要向人民群眾反饋錢塘江的水位,水溫,風力,及水裡的魚量等資訊。在這裡經常會有許多市民從他這裡打聽當日的錢塘江的這些資訊,以便於他們