設(shè)計(jì)模式——觀察者模式

定義:定義對(duì)象間一種對(duì)多種的依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴它的對(duì)象都會(huì)得到通知并被自動(dòng)更新

觀察者模式是一種常見的模式,常見的BroadCast和EventBus都是觀察者模式.
他們都有注冊(cè)的過(guò)程,post來(lái)通知改變,然后所有的觀察者都能被通知到.其實(shí)平時(shí)我們使用的setOnclicklistener也是觀察者模式,?只不過(guò)他是單對(duì)單的觀察者模式.
觀察者模式的UML圖為下(不拘泥于UML圖,僅供參考)

573860a9g75c0ec0401ba&690&690.gif

觀察者模式中得幾種角色

  • ?Suject:抽象主題,也就是被觀察(Observable)的角色,抽象主題把所有觀察者對(duì)象的引用保存在一個(gè)集合里,每個(gè)主題都可以有任意數(shù)量的觀察者奔坟,抽象主題提供一個(gè)借口,可以增加和刪除觀察者對(duì)象蒲凶。
  • Observer:抽象觀察者觅闽,該角色是觀察者的抽象類,它定義了一個(gè)更新接口,使得在得到主題的更改通知時(shí)更新自己
  • ConcreteSubject:?具體主題,當(dāng)被觀察者發(fā)生變化的時(shí)候,給注冊(cè)過(guò)的觀察者發(fā)出通知.
  • ConcreteObserver:具體的觀察者,接受到通知后,更新自己的狀態(tài)

下面貼出示例代碼

//抽象觀察者角色
public interface Watcher
{
    public void update(String str);

}
//具體觀察者角色
public class ConcreteWatcher implements Watcher
{

    @Override
    public void update(String str)
    {
        System.out.println(str);
    }

}
//抽象主題角色,也是被觀察角色
public interface Watched
{
    public void addWatcher(Watcher watcher);

    public void removeWatcher(Watcher watcher);

    public void notifyWatchers(String str);

}
//具體被觀察者
public class ConcreteWatched implements Watched
{
    // 存放觀察者
    private List<Watcher> list = new ArrayList<Watcher>();

    @Override
    public void addWatcher(Watcher watcher)
    {
        list.add(watcher);
    }

    @Override
    public void removeWatcher(Watcher watcher)
    {
        list.remove(watcher);
    }

    @Override
    public void notifyWatchers(String str)
    {
        // 自動(dòng)調(diào)用實(shí)際上是主題進(jìn)行調(diào)用的
        for (Watcher watcher : list)
        {
            watcher.update(str);
        }
    }

}
public class Test
{
    public static void main(String[] args)
    {
        Watched girl = new ConcreteWatched();
        
        Watcher watcher1 = new ConcreteWatcher();
        Watcher watcher2 = new ConcreteWatcher();
        Watcher watcher3 = new ConcreteWatcher();
        
        girl.addWatcher(watcher1);
        girl.addWatcher(watcher2);
        girl.addWatcher(watcher3);
        
        girl.notifyWatchers("開心");
    }

}

上述示例代碼來(lái)自博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跟匆,一起剝皮案震驚了整個(gè)濱河市怪得,隨后出現(xiàn)的幾起案子甜害,更是在濱河造成了極大的恐慌舶掖,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唾那,死亡現(xiàn)場(chǎng)離奇詭異访锻,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)闹获,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門期犬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人避诽,你說(shuō)我怎么就攤上這事龟虎。” “怎么了沙庐?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵鲤妥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我拱雏,道長(zhǎng)棉安,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任铸抑,我火速辦了婚禮贡耽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鹊汛。我一直安慰自己蒲赂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布刁憋。 她就那樣靜靜地躺著滥嘴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪至耻。 梳的紋絲不亂的頭發(fā)上若皱,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音尘颓,去河邊找鬼是尖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛泥耀,可吹牛的內(nèi)容都是我干的饺汹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼痰催,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼兜辞!你這毒婦竟也來(lái)了迎瞧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逸吵,失蹤者是張志新(化名)和其女友劉穎凶硅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扫皱,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡足绅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了韩脑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氢妈。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖段多,靈堂內(nèi)的尸體忽然破棺而出首量,到底是詐尸還是另有隱情,我是刑警寧澤进苍,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布加缘,位于F島的核電站,受9級(jí)特大地震影響觉啊,放射性物質(zhì)發(fā)生泄漏拣宏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一杠人、第九天 我趴在偏房一處隱蔽的房頂上張望勋乾。 院中可真熱鬧,春花似錦搜吧、人聲如沸市俊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至撩满,卻和暖如春蜒程,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伺帘。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工昭躺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伪嫁。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓领炫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親张咳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帝洪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 本文的結(jié)構(gòu)如下: 什么是觀察者模式 為什么要用該模式 模式的結(jié)構(gòu) 代碼示例 推模型和拉模型 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 ...
    w1992wishes閱讀 1,416評(píng)論 0 16
  • 前言 Android的設(shè)計(jì)模式系列文章介紹似舵,歡迎關(guān)注,持續(xù)更新中: Android的設(shè)計(jì)模式-設(shè)計(jì)模式的六大原則一...
    四月葡萄閱讀 30,491評(píng)論 7 64
  • 一葱峡、 概述 觀察者模式是對(duì)象的行為模式砚哗,又叫發(fā)布-訂閱(Publish/Subscribe)模式、模型-視圖(Mo...
    步積閱讀 1,270評(píng)論 0 1
  • 觀察者模式中通常有兩個(gè)基本的概念主題:觀察者和被觀察者砰奕。當(dāng)被觀察者狀態(tài)發(fā)生改變時(shí)蛛芥,需要通知相應(yīng)的觀察者,當(dāng)然军援,每個(gè)...
    時(shí)待吾閱讀 1,040評(píng)論 0 2
  • 相信大家都有看過(guò)《喜洋洋與灰太狼》仅淑,說(shuō)的是灰太狼和羊族的“斗爭(zhēng)”,而每次的結(jié)果都是灰太狼一飛沖天盖溺,伴隨著一句“我還...
    Jet啟思閱讀 5,129評(píng)論 9 23