Java實(shí)現(xiàn)數(shù)據(jù)更新和事件通知的觀察者模式
介紹
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ù)),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-02-02編程入門(mén):掌握J(rèn)ava運(yùn)算符技巧
掌握J(rèn)ava運(yùn)算符技巧,能讓你的編程之旅輕松許多,本指南將帶你深入了解如何巧妙地使用這些強(qiáng)大的工具,讓代碼不僅高效,還充滿樂(lè)趣,跟著我們一起,讓你的Java代碼在運(yùn)算符的魔法下煥發(fā)新生!2023-12-12Java求一個(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-02Spring 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特殊用法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02springboot yml配置文件定義list集合、數(shù)組和map以及使用中的錯(cuò)誤
這篇文章主要介紹了springboot yml配置文件定義list集合、數(shù)組和map以及使用中遇到的錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07