成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

從未這么明白的設(shè)計(jì)模式(二):觀(guān)察者模式

dockerclub / 1209人閱讀

摘要:小麗總是會(huì)在朋友圈發(fā)布自己的各種生活狀態(tài)??偨Y(jié)我們從觀(guān)察者模式特點(diǎn)入手,通過(guò)一個(gè)案例,一步一步完善了觀(guān)察著的寫(xiě)法,特點(diǎn)組后介紹了總已有的實(shí)現(xiàn)關(guān)注我,這里只有干貨同系列文章從未這么明白的設(shè)計(jì)模式一單例模式


本文原創(chuàng)地址,我的博客:https://jsbintask.cn/2019/04/15/designpattern/observer/(食用效果最佳),轉(zhuǎn)載請(qǐng)注明出處!
前言

觀(guān)察者模式定義了對(duì)象間的一種一對(duì)多依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生改變時(shí),觀(guān)察者們都可以做出相應(yīng)的更新,使得系統(tǒng)更易于擴(kuò)展!
代碼地址:https://github.com/jsbintask22/design-pattern-learning

案例

小麗長(zhǎng)得很漂亮,"天生麗質(zhì)難自棄", 是一個(gè)不折不扣的"女神"。

小麗身邊有很多”備胎“,他們通過(guò)各種方式添加了小麗的微信,“小豪,小吳”都是其中之一。

小麗總是會(huì)在朋友圈發(fā)布自己的各種生活狀態(tài)。

”備胎們“總是及時(shí)并且積極地和女神互動(dòng)!

小麗發(fā)現(xiàn)”備胎“小豪不愛(ài)互動(dòng)了,于是刪除了“備胎”小豪的微信。

小豪發(fā)現(xiàn)自己看不了女神動(dòng)態(tài)了。最終死心!

小麗認(rèn)識(shí)了新“備胎”小李,于是小李也添加了女神微信。

小麗發(fā)布自己的朋友圈動(dòng)態(tài),小李也開(kāi)始了互動(dòng)!

上面這個(gè)過(guò)程我們可以抽象出來(lái)兩個(gè)主題,女神小麗,備胎小豪,小吳,小李,我們用代碼模擬這個(gè)追女神的過(guò)程。

代碼實(shí)現(xiàn) V1.0

Beauty代表女神,LittleBoy表示備胎,他們時(shí)刻在關(guān)注著女神的朋友圈,希望獲得互動(dòng),代碼實(shí)現(xiàn)如下:

public class App {
    public static void main(String[] args) throws Exception{
        Beauty beauty = new Beauty();
        // 成功添加了女神微信
        LittleBoy littleBoy = new LittleBoy(beauty);

        // 開(kāi)始查看女神朋友圈
        littleBoy.start();

        // 5s后,女神發(fā)布了朋友圈。
        Thread.sleep(5000L);
        beauty.publishWechat();

        System.in.read();
    }
}

運(yùn)行結(jié)果如下:

嗯!似乎很完美! 美中不足的是好像LittleBoy的run方法一直在輪詢(xún)查看女神朋友圈,它沒(méi)辦法做自己的事情了:

這樣下去很快他就會(huì)失去和女神互動(dòng)的耐心! 所以我們稍微修改下,讓這段代碼看起來(lái)更加”智能”。

V2.0

為了不讓LittleBoy一直輪詢(xún)查看女神狀態(tài),我們可以修改為女神主動(dòng)推送她的狀態(tài)給“備胎們”,這樣他們就可以去做其他事情了!

public class App {
    public static void main(String[] args) throws Exception{
        Beauty beauty = new Beauty();
        LittleBoy littleBoy = new LittleBoy();
        // 添加女神微信
        beauty.littleBoy = littleBoy;

        // 發(fā)布動(dòng)態(tài)
        beauty.publishWechat();
    }
}


嗯!這樣一來(lái)就智能多了! 女神更新朋友圈后主動(dòng)推送消息給備胎!備胎不用死守著女神的朋友圈,而是收到消息后自動(dòng)去查看。所以他們的關(guān)系是這樣了:

但是,現(xiàn)在又有一個(gè)新問(wèn)題!這段代碼好像顯得不夠面向?qū)ο?/b>,不夠?qū)I(yè)。

女神如果想要新加一個(gè)舔狗,就要?jiǎng)优竦倪壿嫶a。

新加了一個(gè)備胎之后,不知道如何把自己的動(dòng)態(tài)分享給他(例如上面的active方法,可能“新備胎”沒(méi)有)。

備胎突然舔不動(dòng)了怎么辦了,他不想再收到女神動(dòng)態(tài)了!

既然這樣,我們把這段代碼修改下,讓它變得“靈活”,更加“面向?qū)ο蟆毙?/p> V3.0

既然要靈活,面向?qū)ο?。我們這么處理:將女神抽象為一個(gè)接口,并且她要能夠刪除備胎,添加備胎,通知備胎。同時(shí)我們將備胎抽象為一個(gè)接口,他能夠在收到女神通知后及時(shí)做出反應(yīng)!
Beauty:

LittleBoy:

它們分別有一個(gè)實(shí)現(xiàn):BeautyImplLittleBoyImpl:

測(cè)試代碼:

public class App {
    public static void main(String[] args) {
        Beauty beauty = new BeautyImpl();
        LittleBoy boy1 = new LittleBoyImpl("小豪");
        LittleBoy boy2 = new LittleBoyImpl("小吳");

        // 添加兩個(gè)備胎
        beauty.addLittleBoy(boy1);
        beauty.addLittleBoy(boy2);

        // 發(fā)布朋友圈
        beauty.publishWechat("最美的不是下雨天,是曾和你一起躲過(guò)雨的屋檐!");

        // 刪除備胎1,并且新添加了備胎3
        beauty.removeLittleBoy(boy1);
        beauty.addLittleBoy(msg -> {
            System.out.println(" 小李:哎喲,不錯(cuò)哦!");
        });

        // 再次發(fā)布朋友圈
        beauty.publishWechat("哪里有彩虹告訴我。。。");
    }
}


嗯!通過(guò)面向接口編程完美的解決了上面的問(wèn)題,現(xiàn)在女神這個(gè)類(lèi)已經(jīng)變得非常靈活了,仔細(xì)觀(guān)察,我們已經(jīng)把我們上面的說(shuō)的案例完全實(shí)現(xiàn)!現(xiàn)在它們的關(guān)系是這樣的:

擴(kuò)展

觀(guān)察者模式這種發(fā)布與訂閱的思想使用的非常廣泛,基本各個(gè)框架,思想都能看到它的身影,而jdk中也已經(jīng)抽象了觀(guān)察與被觀(guān)察者:
java.util.Observer表示觀(guān)察者:

java.util.Obserable表示被觀(guān)察者(例如上面的女神):

然后美中不足的是,jdk把Observable設(shè)計(jì)成了一個(gè)類(lèi),這并不利于擴(kuò)展! 當(dāng)然我們?nèi)匀豢梢宰约簩?shí)現(xiàn)接口,就像上面所做的。

總結(jié)

我們從觀(guān)察者模式特點(diǎn)入手,通過(guò)一個(gè)案例,一步一步完善了觀(guān)察著的寫(xiě)法,特點(diǎn)!組后介紹了jdk總已有的實(shí)現(xiàn)!

關(guān)注我,這里只有干貨!

同系列文章:
從未這么明白的設(shè)計(jì)模式(一):?jiǎn)卫J?/p>

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/74101.html

相關(guān)文章

  • 從未這么明白設(shè)計(jì)模式(一):?jiǎn)卫?em>模式

    摘要:一般來(lái)說(shuō),這種單例實(shí)現(xiàn)有兩種思路,私有構(gòu)造器,枚舉。而這種方式又分了飽漢式,餓漢式。通過(guò)關(guān)鍵字防止指令重排序。什么是單例?為什么要用單例? 一個(gè)類(lèi)被設(shè)計(jì)出來(lái),就代表它表示具有某種行為(方法),屬性(成員變量),而一般情況下,當(dāng)我們想使用這個(gè)類(lèi)時(shí),會(huì)使用new關(guān)鍵字,這時(shí)候jvm會(huì)幫我們構(gòu)造一個(gè)該類(lèi)的實(shí)例。而我們知道,對(duì)于new這個(gè)關(guān)鍵字以及該實(shí)例,相對(duì)而言是比較耗費(fèi)資源的。所以如果我們能夠想...

    NikoManiac 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    Dionysus_go 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    vspiders 評(píng)論0 收藏0
  • 嗨!這是一篇值得深入學(xué)習(xí)控件-RecyclerView(源碼解析篇)

    摘要:其實(shí)通過(guò)父類(lèi)的這個(gè)方法之后會(huì)調(diào)用它的方法,這個(gè)名字熟悉自定義的童鞋都知道了。 為什么要寫(xiě)這篇源碼解析呢? 我一直在說(shuō)RecyclerView是一個(gè)值得深入學(xué)習(xí),甚至可以說(shuō)是一門(mén)具有藝術(shù)性的控件。那到底哪里值得我們花時(shí)間去深入學(xué)習(xí)呢。沒(méi)錯(cuò)了,就是源碼的設(shè)計(jì)。但是看源碼其實(shí)是一件不簡(jiǎn)單的事情,就拿RecyclerView的源碼來(lái)說(shuō),打開(kāi)源碼一看,往下拉啊拉啊,我擦,怎么還沒(méi)到頭,汗.......

    myeveryheart 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<