15笙以、行為型模式-觀察者設(shè)計(jì)模式

觀察者模式

  • 定義對(duì)象間一種一對(duì)多的依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象改變狀態(tài)冻辩,則所有依賴于它的對(duì)象都會(huì)得到通知并自動(dòng)更新猖腕,也叫做發(fā)布訂閱模式Publish/Subscribe,屬于行為型模式

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

  • 消息通知里面:郵件通知恨闪、廣播通知倘感、微信朋友圈、微博私信等咙咽,就是監(jiān)聽觀察事件
  • 當(dāng)一個(gè)對(duì)象的改變需要同時(shí)改變其它對(duì)象老玛,且它不知道具體有多少對(duì)象有待改變的時(shí)候,考慮使用觀察者模式

角色

  • Subject主題:持有多個(gè)觀察者對(duì)象的引用犁珠,抽象主題提供了一個(gè)接口可以增加和刪除觀察者對(duì)象逻炊;有一個(gè)觀察者數(shù)組,并實(shí)現(xiàn)增犁享、刪及通知操作
  • Observer抽象觀察者:為具體觀察者定義一個(gè)接口余素,在得到主題的通知時(shí)更新自己
  • ConcreteSubject具體主題:將有關(guān)狀態(tài)存入具體觀察者對(duì)象,在具體主題內(nèi)部狀態(tài)改變時(shí)炊昆,給所有登記過的觀察者發(fā)出通知
  • ConcreteObserver具體觀察者:實(shí)現(xiàn)抽象觀察者角色所要求的更新接口桨吊,以便使本身的狀態(tài)與主題的狀態(tài)保持一致
觀察者模式

業(yè)務(wù)需求

小滴課堂-老王,技術(shù)比較厲害凤巨,因此上班不想那么辛苦视乐,領(lǐng)導(dǎo)又在周圍,所以選了個(gè)好位置敢茁,方便監(jiān)聽老板的到來(lái)佑淀,
當(dāng)領(lǐng)導(dǎo)即將出現(xiàn)時(shí)老王可以立馬觀察到,趕緊工作彰檬。
用觀察者模式幫助老王實(shí)現(xiàn)這個(gè)需求

編碼:
信息發(fā)布者

public class Subject {
    private List<Observer> observerList = new ArrayList<>();
    /**
     * 新增觀察者
     * @param observer
     */
    public void addObserver(Observer observer){
        this.observerList.add(observer);
    }
    /**
     *刪除觀察者
     * @param observer
     */
    public void deleteObserver(Observer observer){
        this.observerList.remove(observer);
    }
    public void notifyAllObserver(){
        for(Observer observer:this.observerList){
            observer.update();
        }
    }
}

抽象觀察者:

public interface Observer {
    /**
     * 觀察到消息后進(jìn)行的操作伸刃,就是響應(yīng)
     */
    void update();
}

信息發(fā)布者:

public class BossConcreteSubject extends Subject {
    public void doSomething(){
        System.out.println("老板完成自己的工作");
        //還有其他操作
        System.out.println("視察公司工作情況");
        super.notifyAllObserver();
    }
}

具體消費(fèi)者

public class LWConcreteObserver implements Observer {
    @Override
    public void update() {
        System.out.println("老王發(fā)現(xiàn)領(lǐng)導(dǎo)到來(lái),暫停在線摸魚逢倍,回歸工作");
    }
}

具體消費(fèi)者2:

public class AnnaConcreteObserver implements Observer {
    @Override
    public void update() {
        System.out.println("Anna小姐姐發(fā)現(xiàn)領(lǐng)導(dǎo)到來(lái)捧颅,暫停在線摸魚,回歸工作");
    }
}

Main函數(shù)

public class Main {
    public static void main(String[] args) {
        //創(chuàng)建一個(gè)主題较雕,老板
        BossConcreteSubject subject = new BossConcreteSubject();
        //創(chuàng)建觀察者碉哑,就是摸魚的同事
        Observer lwObserver = new LWConcreteObserver();
        //創(chuàng)建觀察者,就是摸魚的同事
        Observer annaObserver = new AnnaConcreteObserver();
        //建立對(duì)應(yīng)的關(guān)系,老板這個(gè)主題被同事進(jìn)行觀察
        subject.addObserver(lwObserver);
        subject.addObserver(annaObserver);
        //主題開始活動(dòng)扣典,里面會(huì)通知觀察者(相當(dāng)于發(fā)布消息)
        subject.doSomething();
    }
}

執(zhí)行結(jié)果:

老板完成自己的工作
視察公司工作情況
老王發(fā)現(xiàn)領(lǐng)導(dǎo)到來(lái)妆毕,暫停在線摸魚,回歸工作
Anna小姐姐發(fā)現(xiàn)領(lǐng)導(dǎo)到來(lái)贮尖,暫停在線摸魚设塔,回歸工作

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

  • 降低了目標(biāo)與觀察者之間的耦合關(guān)系,目標(biāo)與觀察者之間建立了一套觸發(fā)機(jī)制
  • 觀察者和被觀察者是抽象耦合的

缺點(diǎn)

  • 觀察者和觀察目標(biāo)之間有循環(huán)依賴的話远舅,會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用闰蛔,可能導(dǎo)致系統(tǒng)崩潰
  • 一個(gè)被觀察者對(duì)象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間
觀察者設(shè)計(jì)模式UML
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末图柏,一起剝皮案震驚了整個(gè)濱河市序六,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚤吹,老刑警劉巖例诀,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異裁着,居然都是意外死亡繁涂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門二驰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扔罪,“玉大人,你說(shuō)我怎么就攤上這事桶雀】蠼停” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵矗积,是天一觀的道長(zhǎng)全肮。 經(jīng)常有香客問我,道長(zhǎng)棘捣,這世上最難降的妖魔是什么辜腺? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮乍恐,結(jié)果婚禮上评疗,老公的妹妹穿的比我還像新娘。我一直安慰自己禁熏,他們只是感情好壤巷,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布邑彪。 她就那樣靜靜地躺著瞧毙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宙彪,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天矩动,我揣著相機(jī)與錄音,去河邊找鬼释漆。 笑死悲没,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的男图。 我是一名探鬼主播示姿,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逊笆!你這毒婦竟也來(lái)了栈戳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤难裆,失蹤者是張志新(化名)和其女友劉穎子檀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乃戈,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褂痰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了症虑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缩歪。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谍憔,靈堂內(nèi)的尸體忽然破棺而出驶冒,到底是詐尸還是另有隱情,我是刑警寧澤韵卤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布骗污,位于F島的核電站,受9級(jí)特大地震影響沈条,放射性物質(zhì)發(fā)生泄漏需忿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一蜡歹、第九天 我趴在偏房一處隱蔽的房頂上張望屋厘。 院中可真熱鬧,春花似錦月而、人聲如沸汗洒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)溢谤。三九已至瞻凤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間世杀,已是汗流浹背阀参。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞻坝,地道東北人蛛壳。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像所刀,于是被迫代替她去往敵國(guó)和親衙荐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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