033android初級(jí)篇之a(chǎn)ndroid的Observer模式

android中的Observer模式,是繼承自java的實(shí)現(xiàn),使用Observable類和Observer實(shí)現(xiàn)。

Observer模式定義對(duì)象間的一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí), 所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。JDK里提供的observer設(shè)計(jì)模式的實(shí)現(xiàn)由java.util.Observable類和 java.util.Observer接口組成。從名字上可以清楚的看出兩者在Observer 設(shè)計(jì)模式中分別扮演的角色:Observer是觀察者角色,Observable是被觀察目標(biāo)(subject)角色。

應(yīng)用場(chǎng)景

  1. 對(duì)一個(gè)對(duì)象狀態(tài)的更新,需要其他對(duì)象同步更新,而且其他對(duì)象的數(shù)量動(dòng)態(tài)可變。
  2. 對(duì)象僅需要將自己的更新通知給其他對(duì)象而不需要知道其他對(duì)象的細(xì)節(jié)。

優(yōu)缺點(diǎn)

observer模式的優(yōu)點(diǎn)

  1. Subject和Observer之間是松耦合的,分別可以各自獨(dú)立改變。
  2. Subject在發(fā)送廣播通知的時(shí)候,無須指定具體的Observer,Observer可以自己決定是否要訂閱Subject的通知。
  3. 遵守大部分GRASP原則和常用設(shè)計(jì)原則,高內(nèi)聚、低耦合。

observer模式的缺點(diǎn)

  1. 松耦合導(dǎo)致代碼關(guān)系不明顯;
  2. 如果一個(gè)Subject被大量Observer訂閱的話,在廣播通知的時(shí)候可能會(huì)有效率問題。(畢竟只是簡(jiǎn)單的遍歷);
  3. 如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話,觀察目標(biāo)會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰。

實(shí)現(xiàn)

1. 創(chuàng)建被觀察者類,繼承自java.util.Observable類;

public class HousePriceObservable extends Observable {
    private  int price=0;
    public  int getPrice() {
        return  price;
    }
    public  void setPrice(int i) {
        price = i;
        setChanged();
        notifyObservers();
    }
}

HousePriceObservable是被觀察者,當(dāng)它的數(shù)據(jù)發(fā)生變化,調(diào)用

setChanged();
notifyObservers();

通知它的觀察者。

2. 創(chuàng)建觀察者類,它實(shí)現(xiàn)java.util.Observer接口;

要實(shí)現(xiàn)Observer接口的唯一方法update

  public  class  HousePriceObserver implements Observer {
    public void update(Observable o,Object arg) {
        HousePriceObservable m = (HousePriceObservable) o;
        System.out.println("HousePrice has changed to "+ m.getPrice());
    }
}

HousePriceObserver是觀察者,當(dāng)他的被觀察者HousePriceObservable 執(zhí)行了notifyObservers()方法后,它會(huì)調(diào)用update()方法。

3.對(duì)于被觀察者需要調(diào)用addObserver()方法,添加它的觀察者列表。

void addObserver(Observer o)

測(cè)試代碼

HousePriceObservable mHousePriceObservable = new HousePriceObservable();
HousePriceObserver mHousePriceObserver = new HousePriceObserver();

mHousePriceObservable.addObserver(mHousePriceObserver);
mHousePriceObservable.setPrice(1);
mHousePriceObservable.setPrice(2);
mHousePriceObservable.setPrice(3);

參考鏈接

  1. Java:應(yīng)用Observer接口實(shí)踐Observer模式
  2. GRASP (職責(zé)分配原則)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問題# 1.1 訂閱報(bào)紙的過程## 來考慮實(shí)際生活中訂閱報(bào)紙的過程,這里簡(jiǎn)單總結(jié)了一下,訂閱報(bào)紙的基本流程...
    七寸知架構(gòu)閱讀 4,648評(píng)論 5 57
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,869評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,754評(píng)論 18 399
  • 固執(zhí)小姐第一次見到冷漠先生是在初一。 他們兩個(gè)人是初中同學(xué),固執(zhí)小姐對(duì)他的第一印象就是剛到新的班級(jí)報(bào)道,,班主任居...
    我行我素的兔閱讀 390評(píng)論 0 3
  • 2017年4月28日 星期五 多云 昨天的作業(yè)是讓孩子們把試卷帶回家改錯(cuò)后,寫上感受并請(qǐng)家長(zhǎng)簽字。 今天在三個(gè)班評(píng)...
    朱砂紅塵閱讀 649評(píng)論 0 0