觀察者模式

1. 概念

定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí)约巷,所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新姓蜂。

2. 使用場(chǎng)景

觀察者模式就是我們最常使用的按鈕事件的模式,舉例來(lái)說(shuō)忠聚,我們軟件上一個(gè)button赂蕴,我們點(diǎn)擊一下觸發(fā)了click事件柳弄,當(dāng)click時(shí)可能會(huì)觸發(fā)后續(xù)的多個(gè)操作,按鈕就是被依賴的對(duì)象睡腿,點(diǎn)擊以后依賴于它的對(duì)象得到通知并做出反應(yīng)语御,即被自動(dòng)更新峻贮。

3. 類圖

屏幕快照 2021-01-15 下午10.06.44.png

4. 代碼示例

下面的代碼講述這么的事兒席怪,一個(gè)小孩睡醒了就會(huì)哭,他身邊的爸爸纤控、媽媽和狗狗的反應(yīng)...

  • 事件:
abstract class Event<T> {
    abstract T getSource();
}

class wakeUpEvent extends Event<Child>{
    long timestamp;
    String loc;
    Child source;

    public wakeUpEvent(long timestamp, String loc, Child source) {
        this.timestamp = timestamp;
        this.loc = loc;
        this.source = source;
    }
    @Override
    Child getSource() {
        return source;
    }
}
  • 接口及實(shí)現(xiàn)類:
interface Observer {
    void actionOnWakeUp(wakeUpEvent event);
}

class Dad implements Observer {
    public void feed() {
        System.out.println("dad feeding...");
    }

    @Override
    public void actionOnWakeUp(wakeUpEvent event) {
        feed();
    }
}

class Mum implements Observer {
    public void hug() {
        System.out.println("mum hugging...");
    }

    @Override
    public void actionOnWakeUp(wakeUpEvent event) {
        hug();
    }
}

class Dog implements Observer {
    public void wang() {
        System.out.println("dog wang...");
    }

    @Override
    public void actionOnWakeUp(wakeUpEvent event) {
        wang();
    }
}
  • 事件源:
/**
 * 有很多時(shí)候挂捻,觀察者需要根據(jù)事件的具體情況來(lái)進(jìn)行處理
 * 大多數(shù)時(shí)候,我們處理事件的時(shí)候船万,需要事件源對(duì)象
 * 事件也可以形成繼承體系
 */
class Child {
    private boolean cry = false;
    private List<Observer> observers = new ArrayList<>();
    {
        observers.add(new Dad());
        observers.add(new Mum());
        observers.add(new Dog());
        observers.add((e)->{
            System.out.println("ppp");
        });
        //hook callback function
    }
    public boolean isCry() {
        return cry;
    }
    public void wakeUp() {
        cry = true;
        // 將事件源傳遞進(jìn)去刻撒,有時(shí)候是為各個(gè)處理事件的對(duì)象對(duì)于不同的事件源做出不同的處理方式
        wakeUpEvent event = new wakeUpEvent(System.currentTimeMillis(), "bed", this);

        for(Observer o : observers) {
            o.actionOnWakeUp(event);
        }
    }
}
  • 場(chǎng)景類:
public class Main {
    public static void main(String[] args) {
        Child c = new Child();
        // do sth
        c.wakeUp();
    }
}

5. 總結(jié)

以下全是觀察者模式范疇

  • Observer
  • Listener
  • Hook(鉤子函數(shù))
  • Callback

————————————————————
坐標(biāo)帝都,白天上班族耿导,晚上是知識(shí)的分享者
如果讀完覺(jué)得有收獲的話声怔,歡迎點(diǎn)贊加關(guān)注

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者舱呻。
  • 序言:七十年代末醋火,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子箱吕,更是在濱河造成了極大的恐慌芥驳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茬高,死亡現(xiàn)場(chǎng)離奇詭異兆旬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)怎栽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門丽猬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宿饱,“玉大人,你說(shuō)我怎么就攤上這事脚祟⌒炭茫” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵愚铡,是天一觀的道長(zhǎng)蛉签。 經(jīng)常有香客問(wèn)我,道長(zhǎng)沥寥,這世上最難降的妖魔是什么碍舍? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮邑雅,結(jié)果婚禮上片橡,老公的妹妹穿的比我還像新娘。我一直安慰自己淮野,他們只是感情好捧书,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骤星,像睡著了一般经瓷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洞难,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天舆吮,我揣著相機(jī)與錄音,去河邊找鬼队贱。 笑死色冀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柱嫌。 我是一名探鬼主播锋恬,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼编丘!你這毒婦竟也來(lái)了与学?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘪吏,失蹤者是張志新(化名)和其女友劉穎癣防,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掌眠,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕾盯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片级遭。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡望拖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挫鸽,到底是詐尸還是另有隱情说敏,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布丢郊,位于F島的核電站盔沫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏枫匾。R本人自食惡果不足惜架诞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望干茉。 院中可真熱鬧谴忧,春花似錦、人聲如沸角虫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)戳鹅。三九已至均驶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粉楚,已是汗流浹背辣恋。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工亮垫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留模软,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓饮潦,卻偏偏與公主長(zhǎng)得像燃异,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子继蜡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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