亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java實(shí)現(xiàn)數(shù)據(jù)更新和事件通知的觀察者模式

 更新時(shí)間:2023年04月23日 10:47:55   作者:.番茄炒蛋  
Java觀察者模式是一種行為型設(shè)計(jì)模式,用于實(shí)現(xiàn)對(duì)象間的一對(duì)多依賴關(guān)系。當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),它的所有依賴對(duì)象都會(huì)收到通知并自動(dòng)更新。觀察者模式可以實(shí)現(xiàn)松耦合,增強(qiáng)了系統(tǒng)的可維護(hù)性和可拓展性

介紹

Java觀察者模式(也稱發(fā)布-訂閱模式)是一種行為設(shè)計(jì)模式,用于對(duì)象之間的松散耦合,即當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),其他依賴該對(duì)象的對(duì)象會(huì)被自動(dòng)通知并作出相應(yīng)的響應(yīng).

觀察者模式有以下4種角色:

  • Subject(主題):被觀察的對(duì)象,維護(hù)一個(gè)觀察者列表,提供添加,刪除觀察者的方法,以及通知所有觀察者的方法.
  • Observer(觀察者):觀察Subject的變化,當(dāng)Subject變化時(shí)接收通知,進(jìn)行相應(yīng)的操作.
  • ConcreteSubject(具體主題):實(shí)現(xiàn)Subject接口,維護(hù)自己狀態(tài)的變化,當(dāng)狀態(tài)變化時(shí)通知所有的觀察者.
  • ConcreteObserver(具體觀察者):實(shí)現(xiàn)Observer接口,具體實(shí)現(xiàn)在Subject發(fā)生變化時(shí)的響應(yīng)方式.

實(shí)現(xiàn)

觀察者接口

public interface Observer {
    /**
     * 通知觀察者變化信息
     *
     * @param temperature
     * @param humidity
     */
    void update(float temperature,float humidity);
}

主題接口

public interface Subject {
    /**
     * 注冊(cè)觀察者
     *
     * @param observer
     */
    void registerObserver(Observer observer);
    /**
     * 刪除觀察者
     *
     * @param observer
     */
    void removeObserver(Observer observer);
    /**
     * 通知所有觀察者
     */
    void notifyObservers();
}

具體主題

public class WeatherData implements Subject {
    private List<Observer> observers;
    private float temperature;
    private float humidity;
    public WeatherData() {
        observers = new ArrayList<>();
    }
    /**
     * 注冊(cè)觀察者
     *
     * @param observer
     */
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    /**
     * 刪除觀察者
     *
     * @param observer
     */
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    /**
     * 通知所有觀察者
     */
    @Override
    public void notifyObservers() {
        observers.forEach(observer -> observer.update(temperature, humidity));
    }
    /**
     * 設(shè)置天氣信息
     *
     * @param temperature
     * @param humidity
     */
    public void setMeasurements(float temperature, float humidity) {
        this.temperature = temperature;
        this.humidity = humidity;
        notifyObservers();
    }
}

具體觀察者

public class CurrentConditionsDisplay implements Observer {
    private float temperature;
    private float humidity;
    public CurrentConditionsDisplay(Subject weatherData) {
        weatherData.registerObserver(this);
    }
    /**
     * 通知觀察者變化信息
     *
     * @param temperature
     * @param humidity
     */
    @Override
    public void update(float temperature, float humidity) {
        this.temperature = temperature;
        this.humidity = humidity;
        display();
    }
    private void display() {
        System.out.println("溫度:" + temperature + "℃;濕度:" + humidity + "%");
    }
}

測(cè)試

public class Demo {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
        weatherData.setMeasurements(35,53);
        weatherData.setMeasurements(32,48);
        weatherData.setMeasurements(26,44);
    }
}

在這個(gè)例子中,WeatherData是主題,CurrentConditonsDisplay是觀察者.當(dāng)WeatherData的數(shù)據(jù)發(fā)生變化時(shí),它會(huì)通知已經(jīng)注冊(cè)的所有觀察者進(jìn)行相應(yīng)的更新.在這個(gè)例子中CurrentConditionsDisplay觀察者會(huì)展示當(dāng)前的溫度和濕度信息.

總結(jié)

Java觀察者模式時(shí)一種常見(jiàn)的設(shè)計(jì)模式.該模式中,一個(gè)對(duì)象(被觀察者)維護(hù)了一個(gè)觀察者列表,當(dāng)它自身發(fā)生改變時(shí),會(huì)自動(dòng)通知所有觀察者做出相應(yīng)的響應(yīng).

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

  • 松耦合:被觀察者和觀察者之間是松耦合的關(guān)系,它們互相不知道對(duì)方的具體實(shí)現(xiàn),只是通過(guò)接口進(jìn)行通信,因此可以降低系統(tǒng)的耦合度,提高了系統(tǒng)的可擴(kuò)展性.
  • 可重用性:觀察者模式可以注冊(cè)到不同的被觀察者對(duì)象中,被觀察者對(duì)象也可以有多個(gè)觀察者對(duì)象,從而提高了代碼的可重用性.
  • 開(kāi)閉原則:觀察者模式遵循開(kāi)閉原則,因?yàn)樵诓恍薷谋挥^察者和觀察者的情況下,可以動(dòng)態(tài)的添加或刪除觀察者對(duì)象.

缺點(diǎn)

  • 觀察者模式可能會(huì)增加系統(tǒng)的復(fù)雜度和理解難度,因?yàn)橛^察者和被觀察者之間存在多對(duì)多的關(guān)系,如果關(guān)系復(fù)雜,就會(huì)增加系統(tǒng)的復(fù)雜度.
  • 觀察者模式在實(shí)現(xiàn)時(shí)可能會(huì)導(dǎo)致循環(huán)引用的問(wèn)題,需要特別注意.

應(yīng)用場(chǎng)景

  • 當(dāng)一個(gè)對(duì)象的改變需要同時(shí)改變其他對(duì)象時(shí),可以考慮使用觀察者模式,例如實(shí)現(xiàn)GUI界面中的時(shí)間處理機(jī)制.
  • 當(dāng)系統(tǒng)需要在運(yùn)行時(shí)動(dòng)態(tài)地將消息廣播給其他對(duì)象時(shí),可以考慮使用觀察者模式,例如實(shí)現(xiàn)消息推送系統(tǒng).
  • 當(dāng)需要解耦合對(duì)象之間的關(guān)系時(shí),可以考慮使用觀察者模式,例如實(shí)現(xiàn)MVC模式中的數(shù)據(jù)視圖分離.

到此這篇關(guān)于Java實(shí)現(xiàn)數(shù)據(jù)更新和事件通知的觀察者模式的文章就介紹到這了,更多相關(guān)Java觀察者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java快速解析路徑中的參數(shù)(&與=拼接的參數(shù))

    java快速解析路徑中的參數(shù)(&與=拼接的參數(shù))

    這篇文章主要介紹了java快速解析路徑中的參數(shù)(&與=拼接的參數(shù)),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-02-02
  • 編程入門:掌握J(rèn)ava運(yùn)算符技巧

    編程入門:掌握J(rèn)ava運(yùn)算符技巧

    掌握J(rèn)ava運(yùn)算符技巧,能讓你的編程之旅輕松許多,本指南將帶你深入了解如何巧妙地使用這些強(qiáng)大的工具,讓代碼不僅高效,還充滿樂(lè)趣,跟著我們一起,讓你的Java代碼在運(yùn)算符的魔法下煥發(fā)新生!
    2023-12-12
  • OpenCV實(shí)現(xiàn)普通閾值

    OpenCV實(shí)現(xiàn)普通閾值

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)普通閾值,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Dubbo3的Spring適配原理與初始化流程源碼解析

    Dubbo3的Spring適配原理與初始化流程源碼解析

    這篇文章主要為大家介紹了Dubbo3的Spring適配原理與初始化流程源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Java求一個(gè)分?jǐn)?shù)數(shù)列的前20項(xiàng)之和的實(shí)現(xiàn)代碼

    Java求一個(gè)分?jǐn)?shù)數(shù)列的前20項(xiàng)之和的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java求一個(gè)分?jǐn)?shù)數(shù)列的前20項(xiàng)之和的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-02-02
  • Spring Boot Admin Server管理客戶端過(guò)程詳解

    Spring Boot Admin Server管理客戶端過(guò)程詳解

    這篇文章主要介紹了Spring Boot Admin Server管理客戶端過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 詳解SpringMVC驗(yàn)證框架Validation特殊用法

    詳解SpringMVC驗(yàn)證框架Validation特殊用法

    本篇文章主要介紹了詳解SpringMVC驗(yàn)證框架Validation特殊用法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • springboot yml配置文件定義list集合、數(shù)組和map以及使用中的錯(cuò)誤

    springboot yml配置文件定義list集合、數(shù)組和map以及使用中的錯(cuò)誤

    這篇文章主要介紹了springboot yml配置文件定義list集合、數(shù)組和map以及使用中遇到的錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Open?Feign之非SpringCloud方式使用示例

    Open?Feign之非SpringCloud方式使用示例

    這篇文章主要為大家介紹了Open?Feign之非SpringCloud方式使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 關(guān)于Guava緩存詳解及使用說(shuō)明

    關(guān)于Guava緩存詳解及使用說(shuō)明

    這篇文章主要介紹了關(guān)于Guava緩存詳解及使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評(píng)論