成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

輕松學(xué)會觀察者模式

hightopo / 2734人閱讀

摘要:觀察者模式當(dāng)對象間存在一對多關(guān)系時(shí),則使用觀察者模式。觀察者模式屬于行為型模式。觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目標(biāo)對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標(biāo)發(fā)生了變化。

觀察者模式

當(dāng)對象間存在一對多關(guān)系時(shí),則使用觀察者模式(Observer Pattern)。比如,當(dāng)一個(gè)對象被修改時(shí),則會自動通知它的依賴對象。觀察者模式屬于行為型模式。

介紹

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

主要解決:一個(gè)對象狀態(tài)改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協(xié)作。

何時(shí)使用:一個(gè)對象(目標(biāo)對象)的狀態(tài)發(fā)生改變,所有的依賴對象(觀察者對象)都將得到通知,進(jìn)行廣播通知。

如何解決:使用面向?qū)ο蠹夹g(shù),可以將這種依賴關(guān)系弱化。

應(yīng)用實(shí)例:1.拍賣的時(shí)候,拍賣師觀察最高標(biāo)價(jià),然后通知給其他競價(jià)者競價(jià)。
2.打團(tuán)時(shí)每個(gè)職業(yè)做不同的事情。

優(yōu)點(diǎn): 1、觀察者和被觀察者是抽象耦合的。 2、建立一套觸發(fā)機(jī)制。

缺點(diǎn): 1、如果一個(gè)被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費(fèi)很多時(shí)間。 2、如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話,觀察目標(biāo)會觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰。 3、觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目標(biāo)對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標(biāo)發(fā)生了變化。

簡單的說就是:多個(gè)對象去觀察一個(gè)對象是否發(fā)出號令(消息),然后做出相應(yīng)響應(yīng)動作

以DNF打團(tuán)為例子:
當(dāng)團(tuán)長發(fā)出攻堅(jiān)開始的消息時(shí)所有的隊(duì)友開始輸出。

創(chuàng)建一個(gè)職業(yè)的抽象類(觀察者接口):Hero

public abstract class Hero {

    /**
     * 打團(tuán)
     * @param msg
     */
    public abstract void datuan(String msg);

}
分別創(chuàng)建三個(gè)職業(yè)(觀察者)

創(chuàng)建一個(gè)紅眼:Hongyan

public class Hongyan extends Hero {

    private static final String ROLE = "帝血弒天";

    @Override
    public void datuan(String msg) {
        System.out.println(msg+ ROLE +":血魔:弒天! ");
    }
}

創(chuàng)建一個(gè)奶爸:Naiba

public class Naiba extends Hero {

    private static final String ROLE = "神思者";

    @Override
    public void datuan(String msg) {
        System.out.println(msg + ROLE + ": 阿波克列!");
    }
}

創(chuàng)建一個(gè)籃拳:Lanquan

public class Lanquan extends Hero {

    private static final String ROLE = "正義仲裁者";

    @Override
    public void datuan(String msg) {
        System.out.println(msg+ ROLE + ":粉碎吧!");
    }
}

創(chuàng)建一個(gè)團(tuán)長(被觀察者):Captain

public class Captain {

    private List heroes = new ArrayList<>();

    public void setMsg(String msg) {
        notifyAll(msg);
    }
    //訂閱
    public void addTeam(Hero hero) {
        heroes.add(hero);
    }
    //通知所有訂閱的觀察者
    private void notifyAll(String msg) {
        for (Hero observer : heroes) {
            observer.datuan(msg);
        }
    }


}

主程序:Main

public class Main {

    public static void main(String[] args) {
        Lanquan lanquan = new Lanquan();
        Hongyan hongyan = new Hongyan();
        Naiba naiba = new Naiba();

        Captain captain = new Captain();
        captain.addTeam(lanquan);
        captain.addTeam(hongyan);
        captain.addTeam(naiba);
        captain.setMsg("超時(shí)空攻堅(jiān)戰(zhàn)開始-");

    }

}

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

超時(shí)空攻堅(jiān)戰(zhàn)開始-正義仲裁者:粉碎吧!
超時(shí)空攻堅(jiān)戰(zhàn)開始-帝血弒天:血魔:弒天! 
超時(shí)空攻堅(jiān)戰(zhàn)開始-神思者: 阿波克列!

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73582.html

相關(guān)文章

  • 輕松學(xué)會責(zé)任鏈模式

    摘要:設(shè)計(jì)模式責(zé)任鏈模式顧名思義,責(zé)任鏈模式為請求創(chuàng)建了一個(gè)接收者對象的鏈。這種模式給予請求的類型,對請求的發(fā)送者和接收者進(jìn)行解耦。增強(qiáng)給對象指派職責(zé)的靈活性。通過改變鏈內(nèi)的成員或者調(diào)動它們的次序,允許動態(tài)地新增或者刪除責(zé)任。 設(shè)計(jì)模式 - 責(zé)任鏈模式 顧名思義,責(zé)任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個(gè)接收者對象的鏈。這種模式給予請求的類型...

    cheukyin 評論0 收藏0
  • 輕松學(xué)會代理模式

    摘要:在代理模式中,我們創(chuàng)建具有現(xiàn)有對象的對象,以便向外界提供功能接口。注意事項(xiàng)和適配器模式的區(qū)別適配器模式主要改變所考慮對象的接口,而代理模式不能改變所代理類的接口。和裝飾器模式的區(qū)別裝飾器模式為了增強(qiáng)功能,而代理模式是為了加以控制。 代理模式 在代理模式(Proxy Pattern)中,一個(gè)類代表另一個(gè)類的功能。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式。 在代理模式中,我們創(chuàng)建具有現(xiàn)有對象的對象...

    Ali_ 評論0 收藏0
  • 前端基礎(chǔ)進(jìn)階(六):在chrome開發(fā)者工具中觀察函數(shù)調(diào)用棧、作用域鏈與閉包

    摘要:在的開發(fā)者工具中,通過斷點(diǎn)調(diào)試,我們能夠非常方便的一步一步的觀察的執(zhí)行過程,直觀感知函數(shù)調(diào)用棧,作用域鏈,變量對象,閉包,等關(guān)鍵信息的變化。其中表示當(dāng)前的局部變量對象,表示當(dāng)前作用域鏈中的閉包。 showImg(https://segmentfault.com/img/remote/1460000008404321); 在前端開發(fā)中,有一個(gè)非常重要的技能,叫做斷點(diǎn)調(diào)試。 在chrome...

    draveness 評論0 收藏0

發(fā)表評論

0條評論

hightopo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<