欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)文章

最新評(píng)論