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

observer.jpg

前言

Observer本來的意思是“觀察者”,但是實(shí)際上Observer角色并非主動(dòng)的去觀察痊剖,而是被動(dòng)的接收來自觀察對(duì)象角色的通知,因此找颓,Observer也被成為Publish-Subscribe(發(fā)布-訂閱)模式叮贩。它定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象彪蓬。這個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí)档冬,會(huì)通知所有觀察者對(duì)象桃纯,使它們能夠自動(dòng)更新自己。對(duì)于觀察者模式應(yīng)用的也很多呛牲,例如大家最熟悉的MVC框架就是觀察者模式的典型應(yīng)用娘扩,消息推送壮锻,事件監(jiān)聽等都是觀察者模式的最好詮釋。

在圖解設(shè)計(jì)模式中是通過一個(gè)觀察者觀察一個(gè)會(huì)生成數(shù)值的對(duì)象灰殴,并將生成的數(shù)值通過不同的觀察者顯示出來掰邢。照例通過如下UML類圖簡(jiǎn)單熟知下流程。

這里寫圖片描述

觀察者Observer

Observer角色負(fù)責(zé)接收來自觀察者對(duì)象角色的狀態(tài)變化的通知掰伸,它表示“觀察者”狮鸭,具體的觀察者會(huì)實(shí)現(xiàn)該接口,用于生成數(shù)字的觀察對(duì)象角色類NumberGenerator類會(huì)調(diào)用update方法并且將生成的數(shù)字變化的通知發(fā)送給Observer灾部。

public interface Observer {
    public abstract void update(NumberGenerator generator);
}

觀察對(duì)象NumberGenerator

該類是用于生成數(shù)值的抽象類赌髓,提供了獲取數(shù)值和生成數(shù)值的抽象方法蒸痹,需要子類去實(shí)現(xiàn)叠荠。并且提供了一個(gè)存放觀察數(shù)值變化的觀察者對(duì)象的List扫责。方法addObserver(Observer observer)和deleteObserver(Observer observer)用注冊(cè)觀察者和刪除觀察者,重要的一步就是當(dāng)有數(shù)據(jù)變化時(shí)調(diào)用notifyObservers方法通知所有觀察者者娱。

public abstract class NumberGenerator {
    private ArrayList observers=new ArrayList();
    public void addObserver(Observer observer){
        observers.add(observer);
    }
    public void deleteObserver(Observer observer){
        observers.remove(observer);
    }
    public void notifyObservers(){
        Iterator iterator=observers.iterator();
        while (iterator.hasNext()){
            Observer observer= (Observer) iterator.next();
            observer.update(this);
        }
    }
    public abstract int getNumber();
    public abstract void execute();
}

具體的觀察對(duì)象RandomNumberGenerator

對(duì)于該具體觀察者對(duì)象黄鳍,它主要是用來生成隨機(jī)數(shù)框沟,并通過notifiObservers方法把每一次生成的結(jié)果通知給所有已注冊(cè)的觀察者

public class RandomNumberGenerator extends NumberGenerator {
    private Random random = new Random();
    private int number;

    @Override
    public int getNumber() {
        return number;
    }

    @Override
    public void execute() {
        for (int i = 0; i < 5; i++){
            number=random.nextInt(30);
            notifyObservers();
        }
    }
}

具體觀察者

具體觀察者實(shí)現(xiàn)了觀察者Observer接口,當(dāng)update方法被調(diào)用時(shí)會(huì)去獲取要觀察的對(duì)象的最新數(shù)據(jù)忍燥,在此寫了兩個(gè)具體的觀察者梅垄。

public class DigitObserver implements Observer{
    @Override
    public void update(NumberGenerator generator) {
        System.out.println("DigitObserver:"+generator.getNumber());
    }
}

public class GraphObserver implements Observer{
    @Override
    public void update(NumberGenerator generator) {
        System.out.println("GraphObserver:"+generator.getNumber());
    }
}

測(cè)試類

public class Main {
    public static void main(String[] args) {
        NumberGenerator generator=new RandomNumberGenerator();
        Observer observer1=new DigitObserver();
        Observer observer2=new GraphObserver();
        generator.addObserver(observer1);
        generator.addObserver(observer2);
        generator.execute();
    }
}

輸出信息:

DigitObserver:2
GraphObserver:2
DigitObserver:19
GraphObserver:19
DigitObserver:26
GraphObserver:26
DigitObserver:10
GraphObserver:10
DigitObserver:14
GraphObserver:14

通過上面測(cè)試代碼队丝,你應(yīng)該發(fā)現(xiàn)對(duì)于觀察者對(duì)象可以有多個(gè)觀察者對(duì)其作出響應(yīng)欲鹏,如某些訂閱專欄,它可以被很多人訂閱吞加,當(dāng)專欄有內(nèi)容更新時(shí),它會(huì)給每一個(gè)人發(fā)送推送衔憨,我們?cè)谟嗛唽诤蠹迹⒉恍枰覀円恢比サ却膬?nèi)容更新,而不能去做自己的事情德崭。

好了揖盘,今天的觀察者模式到此結(jié)束。有問題歡迎留言指出憾股,Have a wonderful day .

如需文章中所寫代碼箕慧,請(qǐng)移步GitHub查看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颠焦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子座享,更是在濱河造成了極大的恐慌似忧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淳衙,死亡現(xiàn)場(chǎng)離奇詭異箫攀,居然都是意外死亡幼衰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門梢睛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绝葡,“玉大人,你說我怎么就攤上這事藏畅。” “怎么了绞蹦?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵幽七,是天一觀的道長(zhǎng)锉走。 經(jīng)常有香客問我滨彻,道長(zhǎng)亭饵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任踏兜,我火速辦了婚禮八秃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疹尾。我一直安慰自己骤肛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布繁成。 她就那樣靜靜地躺著巾腕,像睡著了一般面睛。 火紅的嫁衣襯著肌膚如雪侮穿。 梳的紋絲不亂的頭發(fā)上毁嗦,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天狗准,我揣著相機(jī)與錄音,去河邊找鬼袭祟。 笑死巾乳,一個(gè)胖子當(dāng)著我的面吹牛鸟召,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播欧募,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼种冬,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼舔糖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起十兢,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤纪挎,失蹤者是張志新(化名)和其女友劉穎异袄,沒想到半個(gè)月后玛臂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體封孙,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虎忌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年膜蠢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挑围。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杉辙,死狀恐怖蜘矢,靈堂內(nèi)的尸體忽然破棺而出综看,到底是詐尸還是另有隱情寓搬,我是刑警寧澤县耽,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站唾琼,受9級(jí)特大地震影響锡溯,放射性物質(zhì)發(fā)生泄漏祭饭。R本人自食惡果不足惜叙量,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一寺鸥、第九天 我趴在偏房一處隱蔽的房頂上張望猪钮。 院中可真熱鬧烤低,春花似錦、人聲如沸扑馁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闯第。三九已至,卻和暖如春缀拭,著一層夾襖步出監(jiān)牢的瞬間咳短,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工蛛淋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咙好,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓褐荷,卻偏偏與公主長(zhǎng)得像勾效,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叛甫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 觀察者模式 有時(shí)层宫,我們希望在一個(gè)對(duì)象的狀態(tài)改變時(shí)更新另外一組對(duì)象。在MVC模式中有這樣一個(gè)非常常見的例子其监,假設(shè)在兩...
    英武閱讀 4,172評(píng)論 0 51
  • 介紹 定義:觀察者模式(Observer)有時(shí)又被稱為發(fā)布/訂閱模式萌腿,當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生改變時(shí)抖苦,依賴它的對(duì)象全部會(huì)...
    四月不見閱讀 364評(píng)論 0 0
  • 前言定義:觀察者設(shè)計(jì)模式定義了對(duì)象間的一種一對(duì)多的依賴關(guān)系,以便一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí)窗慎,所有依賴于它的對(duì)象都得到...
    xsp單細(xì)胞閱讀 449評(píng)論 0 1
  • 在正式介紹觀察者模式前脯丝,我們先引用生活中的小例子來模擬觀察者,先對(duì)觀察者模式有一個(gè)整體的感覺材蹬。 現(xiàn)實(shí)模擬 報(bào)紙和雜...
    六尺帳篷閱讀 1,637評(píng)論 6 18
  • 之前聽體驗(yàn)過催眠的朋友說她催眠回來感覺不錯(cuò),問的問題有得到啟發(fā)乓旗,讓我也蠻好奇想去體驗(yàn)一下,就讓朋友給我發(fā)催眠工作室...
    林瀟Ena閱讀 3,895評(píng)論 2 6