最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年04月30日 10:01:17   作者:夢青塵  
這篇文章主要介紹了Java設(shè)計(jì)模式之觀察者模式(Observer模式),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下

一、觀察者模式是什么?

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

人話: 就像微信公眾號推送消息,訂閱的人能收到,沒訂閱的收不到,還可以取消/添加訂閱

二、模式分析

2.1 四個(gè)角色

  • 抽象主題(抽象被觀察者角色):也就是一個(gè)抽象主題,它把所有對觀察者對象的引用保存在一個(gè)集合中,每個(gè)主題都可以有任意數(shù)量的觀察者。抽象主題提供一個(gè)接口,可以增加和刪除觀察者角色。一般用一個(gè)抽象類和接口來實(shí)現(xiàn)。
  • 抽象觀察者角色:為所有的具體觀察者定義一個(gè)接口,在得到主題通知時(shí)更新自己。
  • 具體主題(具體被觀察者角色):也就是一個(gè)具體的主題,在集體主題的內(nèi)部狀態(tài)改變時(shí),所有登記過的觀察者發(fā)出通知。
  • 具體觀察者角色:實(shí)現(xiàn)抽象觀察者角色所需要的更新接口,一邊使本身的狀態(tài)與制圖的狀態(tài)相協(xié)調(diào)。

2.2 案例

  • 微信公眾號

1.抽象主題

public interface  Subject {

    /**
     * 注冊觀察者
     */
    void registerObserver(observer observer);

    /**
     * 移除觀察者
     */
    void removeObserver(observer observer);

    /**
     * 通知觀察者
     */
    void notifyObservers();

}

2.抽象觀察者角色

public interface observer {
    /**
     * 更新
     */
    void update(String message);
}

3.具體主題

用Vector是線程同步的,比較安全,也可以使用ArrayList,是線程異步的,但不安全。

public class WechatServer implements Subject{
    //注意到這個(gè)List集合的泛型參數(shù)為Observer接口,設(shè)計(jì)原則:面向接口編程而不是面向?qū)崿F(xiàn)編程
    private Vector<observer> list;
    private String message;

    public WechatServer() {
        list = new Vector<observer>();
    }
    @Override
    public void registerObserver(observer observer) {
        list.add(observer);
    }

    @Override
    public void removeObserver(observer observer) {
        if(!list.isEmpty())
            list.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for(int i = 0; i < list.size(); i++) {
            observer oserver = list.get(i);
             oserver.update(message);
        }
    }

    public void setInfomation(String s) {
        this.message = s;
        System.out.println("微信服務(wù)更新消息: " + s);
        //消息更新,通知所有觀察者
        notifyObservers();
    }
}

4.具體觀察者角色

public class User implements observer {
    private String name;
    private String message;

    public User(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        this.message = message;
        read();
    }

    public void read() {
        System.out.println(name + " 收到推送消息: " + message);
    }
}

5.測試類

public class Test {
    public static void main(String[] args) {
        //主題
        WechatServer server = new WechatServer();

        //觀察者
        observer userZhang = new User("ZhangSan");
        observer userLi = new User("LiSi");
        observer userWang = new User("WangWu");
        
        server.registerObserver(userZhang);
        server.setInfomation("C是世界上最好用的語言!");
        System.out.println("====================================");
        server.registerObserver(userLi);
        server.registerObserver(userWang);
        server.setInfomation("JAVA是世界上最好用的語言!");

    }
}

6.結(jié)果

在這里插入圖片描述


三、觀察者模式的優(yōu)缺點(diǎn)

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

解除耦合,讓耦合的雙方都依賴于抽象,從而使得各自的變換都不會影響另一邊的變換。

缺點(diǎn)

在應(yīng)用觀察者模式時(shí)需要考慮一下開發(fā)效率和運(yùn)行效率的問題,程序中包括一個(gè)被觀察者、多個(gè)觀察者,開發(fā)、調(diào)試等內(nèi)容會比較復(fù)雜,而且在Java中消息的通知一般是順序執(zhí)行,那么一個(gè)觀察者卡頓,會影響整體的執(zhí)行效率,在這種情況下,一般會采用異步實(shí)現(xiàn)。

四、總結(jié)

當(dāng)一個(gè)對象的改變需要同時(shí)改變其它對象,并且它不知道具體有多少對象有待改變的時(shí)候,應(yīng)該考慮使用觀察者模式。 而使用觀察者模式的動機(jī)在于:將一個(gè)系統(tǒng)分割成一系列相互協(xié)作的類有一個(gè)很不好的副作用,就是需要維護(hù)相關(guān)對象間的一致性,我們不希望為了維持一致性而使各類緊密耦合,這樣會給維護(hù)、擴(kuò)展和重用都帶來不便,而觀察者模式所做的工作就是在解除耦合。

到此這篇關(guān)于Java設(shè)計(jì)模式之觀察者模式(Observer模式)的文章就介紹到這了,更多相關(guān)Java觀察者模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis mapper接口動態(tài)代理開發(fā)步驟解析

    Mybatis mapper接口動態(tài)代理開發(fā)步驟解析

    這篇文章主要介紹了Mybatis mapper接口動態(tài)代理開發(fā)步驟解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • JavaBean和Map轉(zhuǎn)換封裝類的方法

    JavaBean和Map轉(zhuǎn)換封裝類的方法

    下面小編就為大家?guī)硪黄狫avaBean和Map轉(zhuǎn)換封裝類的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-10-10
  • Java靜態(tài)static與實(shí)例instance方法示例

    Java靜態(tài)static與實(shí)例instance方法示例

    這篇文章主要為大家介紹了Java靜態(tài)static與實(shí)例instance方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Spring FreeMarker整合Struts2過程詳解

    Spring FreeMarker整合Struts2過程詳解

    這篇文章主要介紹了Spring FreeMarker整合Struts2過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java獲取某一日期的前N天(使用Calendar類)

    Java獲取某一日期的前N天(使用Calendar類)

    這篇文章主要給大家介紹了關(guān)于Java如何使用Calendar類獲取某一日期的前N天,我們可以使用Java中的Calendar類來獲取前n天的時(shí)間,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-08-08
  • RestTemplate 401 獲取錯(cuò)誤信息的處理方案

    RestTemplate 401 獲取錯(cuò)誤信息的處理方案

    這篇文章主要介紹了RestTemplate 401 獲取錯(cuò)誤信息的處理方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java面向?qū)ο髮?shí)現(xiàn)汽車租賃系統(tǒng)

    Java面向?qū)ο髮?shí)現(xiàn)汽車租賃系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java面向?qū)ο髮?shí)現(xiàn)汽車租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 關(guān)于Java中的IO流總結(jié)(推薦)

    關(guān)于Java中的IO流總結(jié)(推薦)

    下面小編就為大家?guī)硪黄P(guān)于Java中的IO流總結(jié)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java中Mybatis分頁查詢的四種傳參方式

    Java中Mybatis分頁查詢的四種傳參方式

    這篇文章主要介紹了Java中Mybatis分頁查詢的四種傳參方式:順序傳參,@param傳參,自定義POJO類傳參,Map傳參,想詳細(xì)了解傳參方式的小伙伴可以詳細(xì)閱讀本文,有一定的而參考價(jià)值
    2023-03-03
  • SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)

    SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)

    這篇文章主要介紹了SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評論

桓仁| 运城市| 北京市| 霸州市| 牙克石市| 杭锦后旗| 隆昌县| 兴隆县| 潮州市| 高阳县| 白朗县| 渝中区| 安乡县| 玉林市| 晋中市| 巴彦县| 济源市| 靖西县| 千阳县| 客服| 盱眙县| 六枝特区| 沙田区| 肇源县| 东宁县| 寿宁县| 延寿县| 花莲县| 武威市| 通城县| 西峡县| 河东区| 定西市| 镇康县| 淄博市| 喀喇沁旗| 大方县| 忻城县| 栾城县| 黎川县| 武邑县|