Android設(shè)計(jì)模式(十八)-- 觀察者模式

源代碼
GitHub源代碼

1.本文目標(biāo)

本文目標(biāo)是為了讓大家認(rèn)識(shí)并理解觀察者模式

2.基本套路

定義:定義了對(duì)象之間的一對(duì)多依賴,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象,當(dāng)主題對(duì)象發(fā)生變化時(shí),它的所有觀察者都會(huì)收到通知并更新
類型:行為型
選擇關(guān)鍵點(diǎn):觀察者與被觀察者是否是多對(duì)一的關(guān)系
設(shè)計(jì)原則:遵循迪米特、開閉原則
使用概率:40%
難度系數(shù):中

3.適用場(chǎng)景

1.關(guān)聯(lián)行為場(chǎng)景,建立一套觸發(fā)機(jī)制

4.使用步驟

用栗子能更好的說明問題,請(qǐng)繼續(xù)往下看

5.舉個(gè)栗子

我們用具體的代碼去更好的理解這個(gè)設(shè)計(jì)模式

5.1栗子說明

  • 背景:我有好幾個(gè)女朋友,一直觀察著我,我去夜店觀察我,去泡吧也觀察我
  • 目的:用觀察者模式模擬女朋友觀察我,然后我是被觀察者,我去干什么事兒都主動(dòng)通知女朋友們

5.2使用步驟

實(shí)現(xiàn)代碼如下:

步驟1.創(chuàng)建觀察者,女朋友們 是觀察者

public interface Observer {
    void update(String state);
}

步驟2.創(chuàng)建我的其中一個(gè)女朋友,觀察者的一個(gè)子類 實(shí)現(xiàn)類

public class GirlFriendObserver implements Observer {
    private String name;
    public String getName() {
        return name;
    }

    public GirlFriendObserver(String name) {
        super();
        this.name = name;
    }

    @Override
    public void update(String state) {
        System.out.println(name + "接到最新消息,男朋友最新狀態(tài):" + state);
    }
}

步驟3.創(chuàng)建被觀察者 ,我自己

public abstract class Observable {

    private ArrayList<Observer> observers = new ArrayList<Observer>();

    /**
     * 添加一個(gè)觀察者
     */
    public void attach(Observer observer) {
        observers.add(observer);
        System.out.println("我新交了一個(gè)女朋友");
    }

    /**
     *去掉一個(gè)觀察者 
     */
    public void dettch(Observer observer) {
        observers.remove(observer);
        System.out.println("我和她分手了");
    }

    /**
     * 通知觀察者(就是通知我的女朋友們)
     */
    public void notyfyObservers(String state) {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }
}

步驟4. 創(chuàng)建被觀察者的 子類

public class MessageObservable extends Observable {
    public void change(String state) {
        notyfyObservers(state);
    }
}

步驟5. 測(cè)試,女朋友是觀察者,我是被觀察者,現(xiàn)實(shí)中是觀察者一直觀察被觀察者,如果我去泡吧了,直接分手叮盘。在代碼中,是被觀察者主動(dòng)告訴觀察者,我去泡吧了或者大保健了,然后分手违诗。這樣可以減少資源的不必要的浪費(fèi),提高性能

 public static void main(String[] args) {
        //創(chuàng)建2個(gè)觀察者
        Observer fanbingbing = new GirlFriendObserver("范冰冰");
        Observer yangmi = new GirlFriendObserver("楊冪");

        //創(chuàng)建被觀察者
        MessageObservable messageSubject = new MessageObservable();

        //被觀察者 添加 觀察者 到集合中
        messageSubject.attach(fanbingbing);
        messageSubject.attach(yangmi);
        //被觀察者 通知 觀察者,我都干了什么
        messageSubject.change("我在大保健");

        messageSubject.dettch(yangmi);
        messageSubject.notyfyObservers("泡吧");
 }

6.優(yōu)點(diǎn)

  • 觀察者和被觀察者之間建立一個(gè)抽象的耦合
  • 觀察者模式支持廣播通信

7.缺點(diǎn)

  • 觀察者之間有過多的細(xì)節(jié)依賴,提高時(shí)間消耗和程序復(fù)雜度
  • 使用要得當(dāng),要避免循環(huán)調(diào)用

8.總結(jié)

本文只是對(duì)觀察者模式進(jìn)行一個(gè)分享,接下來會(huì)從創(chuàng)建型模式,結(jié)構(gòu)型模式,行為型模式,這三大類展開一個(gè)系列分享,大家可以持續(xù)進(jìn)行關(guān)注,信仰年輕的設(shè)計(jì)模式,蟹蟹啦策添。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末母赵,一起剝皮案震驚了整個(gè)濱河市特恬,隨后出現(xiàn)的幾起案子舆逃,更是在濱河造成了極大的恐慌,老刑警劉巖痛悯,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件余黎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡载萌,警方通過查閱死者的電腦和手機(jī)惧财,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扭仁,“玉大人垮衷,你說我怎么就攤上這事」宰梗” “怎么了搀突?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)熊泵。 經(jīng)常有香客問我仰迁,道長(zhǎng),這世上最難降的妖魔是什么顽分? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任徐许,我火速辦了婚禮,結(jié)果婚禮上卒蘸,老公的妹妹穿的比我還像新娘雌隅。我一直安慰自己,他們只是感情好缸沃,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布恰起。 她就那樣靜靜地躺著,像睡著了一般趾牧。 火紅的嫁衣襯著肌膚如雪检盼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天翘单,我揣著相機(jī)與錄音梯皿,去河邊找鬼。 笑死县恕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的剂桥。 我是一名探鬼主播忠烛,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼权逗!你這毒婦竟也來了美尸?” 一聲冷哼從身側(cè)響起冤议,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎师坎,沒想到半個(gè)月后恕酸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胯陋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年蕊温,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遏乔。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡义矛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盟萨,到底是詐尸還是另有隱情凉翻,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布捻激,位于F島的核電站制轰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胞谭。R本人自食惡果不足惜垃杖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望韭赘。 院中可真熱鬧缩滨,春花似錦、人聲如沸泉瞻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袖牙。三九已至侧巨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鞭达,已是汗流浹背司忱。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畴蹭,地道東北人坦仍。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叨襟,于是被迫代替她去往敵國(guó)和親繁扎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚、低耦合和單一職能的“沖突”實(shí)際上梳玫,這兩者...
    彥幀閱讀 3,752評(píng)論 0 14
  • 1 場(chǎng)景問題# 1.1 訂閱報(bào)紙的過程## 來考慮實(shí)際生活中訂閱報(bào)紙的過程爹梁,這里簡(jiǎn)單總結(jié)了一下,訂閱報(bào)紙的基本流程...
    七寸知架構(gòu)閱讀 4,631評(píng)論 5 57
  • 設(shè)計(jì)模式匯總 一提澎、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用姚垃、多...
    MinoyJet閱讀 3,949評(píng)論 1 15
  • 下面總結(jié)設(shè)計(jì)模式中的行為型模式: 1.責(zé)任鏈模式 顧名思義,責(zé)任鏈模式(Chain of Responsibili...
    Steven1997閱讀 3,471評(píng)論 0 1
  • 深夜學(xué)習(xí)筆記之二: 學(xué)哲學(xué)盼忌,用哲學(xué)积糯。 哲學(xué)精神的缺乏,反映在幾乎所有的領(lǐng)域碴犬。 數(shù)學(xué)領(lǐng)域絮宁,很少有我們自己建立的理論體...
    馬唐閱讀 341評(píng)論 0 0