java設(shè)計(jì)模式-觀察者模式詳解

先簡(jiǎn)單介紹一下觀察者模式:在對(duì)象之間定義一對(duì)多的依賴,這樣當(dāng)一個(gè)對(duì)象改變狀態(tài)宏所,依賴它的對(duì)象都會(huì)收到通知,并自動(dòng)更新。
相信大家對(duì)回調(diào)都非常熟悉了,這里可以把回調(diào)看作是觀察者模式的一種特殊類型离福,即只有一個(gè)觀察者。
下面用圖來(lái)描述一下觀察者和被觀察者之間的關(guān)系:

home.png

?張三炼蛤,趙四妖爷,王五都訂了牛奶。送奶工過(guò)來(lái)后通知他們過(guò)來(lái)取奶理朋,這時(shí)某六看到絮识,也想訂奶,就和送奶工說(shuō)以后也給我送嗽上。之后送奶工就給他們四人送奶次舌。


home.png

某天張三不想喝奶了,就和送奶工說(shuō)我不喝了兽愤,以后別給我送了彼念。之后送奶工就只給趙四,王五烹看,趙六送奶了


home.png

圖畫(huà)的不好国拇,請(qǐng)大家忍住別笑,下面說(shuō)一下送奶工(被觀察者)的工作流程惯殊。
在這里張三酱吝,趙四,王五土思,某六都是觀察者务热。在第一幅圖片中某六并沒(méi)有訂奶忆嗜,所以沒(méi)有收到送奶工的通知。于是它和送奶工說(shuō)我也要喝牛奶崎岂,就訂閱了捆毫。
之后送奶工就給四個(gè)人送奶并通知他們。某天張三不想喝奶了冲甘,就告訴送奶工說(shuō)我不想喝牛奶了绩卤,以后別送了。這時(shí)他就取消了訂閱江醇,之后送奶工就不再通知張三過(guò)來(lái)取奶了濒憋。

好了,圖片介紹完了陶夜,下面上代碼凛驮。

在這里將被觀察者抽象為一個(gè)接口,這樣當(dāng)這個(gè)送奶工哪天不想做了的時(shí)候条辟,我們可以立刻換個(gè)送奶工代替他去工作:

public interface Subject {
    //注冊(cè)觀察者
    void registerObserver(MyOberver o);
    //移除觀察者
    void removeObserver(MyOberver o);
    //通知觀察者
    void notifyObservers();
}

接下來(lái)定義觀察者的接口,這里只有一個(gè)方法黔夭,取奶:

public interface MyOberver {
    //取奶
    void getMilk();
}

接下來(lái),讓送奶工 A實(shí)現(xiàn)subject:

public class A implements Subject {
    //創(chuàng)建一個(gè)集合羽嫡,管理觀察者
    private List<MyOberver> observers;

    public A(){
        observers = new ArrayList<>();
    }
    @Override
    public void registerObserver(MyOberver o) {
       //每注冊(cè)一個(gè)觀察者?本姥,將他加入觀察者集合中
        observers.add(o);
    }

    @Override
    public void removeObserver(MyOberver o) {
       //獲得觀察者在集合中的索引,并移除
        int i = observers.indexOf(o);
        if ( i >= 0){
            observers.remove(i);
        }
    }

    @Override
    public void notifyObservers() {
       //遍歷集合中的觀察者厂僧,并通知他們?nèi)∧?        for(int i = 0; i < observers.size(); i++){
            MyOberver oberver = observers.get(i);
            oberver.getMilk();
        }
    }
}

然后定義被觀察者:

public class Observer implements MyOberver {
    private Subject milkStuff;
    private String name;
    public Observer(Subject milkStuff,String name) {
        this.milkStuff = milkStuff;
       //在構(gòu)造方法中將當(dāng)前對(duì)象注冊(cè)當(dāng)觀察者集合中
        milkStuff.registerObserver(this);
        this.name = name;
    }

    @Override
    public void getMilk() {
        System.out.println("我是" + name + ",馬上來(lái)取奶...");
    }
}

最后寫一個(gè)main方法測(cè)試就ok啦

public static void main(String[] args) {
         A milkStuff = new A();
         MyOberver zs = new Observer(milkStuff,"張三");
         MyOberver ls = new Observer(milkStuff,"李四");
         MyOberver ww = new Observer(milkStuff,"王五");
         MyOberver ml = new Observer(milkStuff,"某六");
         milkStuff.notifyObservers();
    }

在這里我只是簡(jiǎn)單的闡述了觀察者模式的原理扣草,幫助大家弄懂這種優(yōu)秀的設(shè)計(jì)模式。真正應(yīng)用起來(lái)肯定會(huì)比這個(gè)例子復(fù)雜的多颜屠。

希望自己在成為大牛的路上愈行愈遠(yuǎn)辰妙,與大家共勉

?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市甫窟,隨后出現(xiàn)的幾起案子密浑,更是在濱河造成了極大的恐慌,老刑警劉巖粗井,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尔破,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡浇衬,警方通過(guò)查閱死者的電腦和手機(jī)懒构,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)耘擂,“玉大人胆剧,你說(shuō)我怎么就攤上這事。” “怎么了秩霍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵篙悯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我铃绒,道長(zhǎng)鸽照,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任颠悬,我火速辦了婚禮矮燎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赔癌。我一直安慰自己漏峰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布届榄。 她就那樣靜靜地躺著,像睡著了一般倔喂。 火紅的嫁衣襯著肌膚如雪铝条。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天席噩,我揣著相機(jī)與錄音班缰,去河邊找鬼。 笑死悼枢,一個(gè)胖子當(dāng)著我的面吹牛埠忘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播馒索,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼莹妒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绰上?” 一聲冷哼從身側(cè)響起旨怠,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜈块,沒(méi)想到半個(gè)月后鉴腻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡百揭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年爽哎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片器一。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡课锌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盹舞,到底是詐尸還是另有隱情产镐,我是刑警寧澤隘庄,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站癣亚,受9級(jí)特大地震影響丑掺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜述雾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一街州、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玻孟,春花似錦唆缴、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至匣掸,卻和暖如春趟紊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碰酝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工霎匈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人送爸。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓铛嘱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親袭厂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子墨吓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • 1 場(chǎng)景問(wèn)題# 1.1 訂閱報(bào)紙的過(guò)程## 來(lái)考慮實(shí)際生活中訂閱報(bào)紙的過(guò)程,這里簡(jiǎn)單總結(jié)了一下嵌器,訂閱報(bào)紙的基本流程...
    七寸知架構(gòu)閱讀 4,603評(píng)論 5 57
  • 最近日子過(guò)得有點(diǎn)亂肛真, 可能因?yàn)槭悄甑酌Φ脑颍ぷ髀氊?zé)的來(lái)回轉(zhuǎn)換讓人有點(diǎn)跟不上節(jié)奏爽航, 晚上的私人時(shí)間幾乎全部都貢獻(xiàn)...
    罐頭是誰(shuí)閱讀 201評(píng)論 0 0
  • 如今讥珍,大多數(shù)人都是寂寞的历极,早九晚六,雙休節(jié)假日衷佃,對(duì)于很多工作者而言趟卸,這已經(jīng)是工作的標(biāo)配,每天回到家,忙著工作的事情...
    俗阿熊閱讀 508評(píng)論 1 0
  • 2007交作業(yè)七天一篇锄列,時(shí)間上其實(shí)已經(jīng)很充足图云,總是糾結(jié)著什么,想好一個(gè)標(biāo)題寫了改改了寫要如此反復(fù)好多遍邻邮,寫幾句就覺(jué)...
    筱夏美飾閱讀 200評(píng)論 3 0