日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java 观察者模式_图解Java设计模式之观察者模式

發(fā)布時(shí)間:2023/12/10 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 观察者模式_图解Java设计模式之观察者模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

    • 天氣預(yù)報(bào)項(xiàng)目需求
    • 天氣預(yù)報(bào)設(shè)計(jì)方案 1 - 普通方案
    • 觀察者模式(Observer)原理
    • 觀察者模式解決天氣預(yù)報(bào)需求
    • 觀察者模式在JDK應(yīng)用的源碼分析

天氣預(yù)報(bào)項(xiàng)目需求

1)氣象站可以將每天測(cè)量到的濕度、溫度、氣壓等等以公告的形式發(fā)布出去(比如發(fā)布到自己的網(wǎng)站或第三方)。
2)需要設(shè)計(jì)開放型API,便于其他第三方也能接入氣象站獲取數(shù)據(jù)。
3)提供溫度、氣壓和濕度的接口。
4)測(cè)量數(shù)據(jù)更新時(shí),要能實(shí)時(shí)的通知給第三方。

天氣預(yù)報(bào)設(shè)計(jì)方案 1 - 普通方案

通過(guò)對(duì)氣象站項(xiàng)目的分析,設(shè)計(jì)出一個(gè)WeatherData類


說(shuō)明 :
1)通過(guò)getXxx方法,可以讓第三方接入,并得到相關(guān)信息。
2)當(dāng)數(shù)據(jù)有更新時(shí),氣象站通過(guò)調(diào)用dataChange()去更新數(shù)據(jù),當(dāng)?shù)谌皆俅潍@取時(shí),就能得到最新數(shù)據(jù),當(dāng)然也可以推送。


CurrentConditions(當(dāng)前的天氣情況)
// 推送
可以理解成是我們氣象局的網(wǎng)站

package

問(wèn)題分析 :
1)其他第三方接入氣象站獲取數(shù)據(jù)的問(wèn)題
2)無(wú)法在運(yùn)行時(shí)動(dòng)態(tài)的添加第三方(新浪網(wǎng)站)
3)違反ocp原則 -》觀察者模式
在WeatherData中,當(dāng)增加一個(gè)第三方,都需要?jiǎng)?chuàng)建一個(gè)對(duì)應(yīng)的第三方的公告板對(duì)象,并加入到dataChange,不利于維護(hù),也不是動(dòng)態(tài)加入。
public void dataChange() {
currentConditions.update(getTemperature(),getPressure(),getHumidity());
}

觀察者模式(Observer)原理

觀察者模式類似訂牛奶業(yè)務(wù)
1)奶站/氣象局 :Subject
2)用戶/第三方網(wǎng)站 :Observer
Subject :登記注冊(cè)、移除和通知


1)registerObserver 注冊(cè)
2)removeObserver 移除
3)notifyObservers() 通知所有的注冊(cè)的用戶,根據(jù)不同需求,可以是更新數(shù)據(jù),讓用戶來(lái)取,也可能是實(shí)時(shí)推送,看具體需求定。
Observer :接收輸入
觀察者模式 :對(duì)象之間多對(duì)一依賴的一種設(shè)計(jì)方案,被依賴的對(duì)象為Subject,依賴的對(duì)象為Observer,Subject通知Observer變化,比如這里的奶站是Subject,是1的一方。用戶是Observer,是多的一方。

觀察者模式解決天氣預(yù)報(bào)需求

package com.example.demo.observer.improve;/*** 觀察者接口,有觀察者來(lái)實(shí)現(xiàn)* @author zhaozhaohai**/ public interface Observer {public void update(float temperatrue, float pressure, float humidity);} package com.example.demo.observer.improve;public interface Subject {public void registerObserver(Observer observer);public void removeObserver(Observer observer);public void notifyObservers();} package com.example.demo.observer.improve;//顯示當(dāng)前天氣情況(可以理解成是氣象站自己的網(wǎng)站) public class CurrentConditions implements Observer{// 溫度,氣壓,濕度 private float temperature; private float pressure; private float humidity;//更新 天氣情況,是由 WeatherData 來(lái)調(diào)用,我使用推送模式 public void update(float temperature, float pressure, float humidity) {this.temperature = temperature; this.pressure = pressure; this.humidity = humidity; display();}//顯示public void display() {System.out.println("***Today mTemperature: " + temperature + "***"); System.out.println("***Today mPressure: " + pressure + "***"); System.out.println("***Today mHumidity: " + humidity + "***");} } package com.example.demo.observer.improve;import java.util.ArrayList; import java.util.List;/*** 類是核心* 1. 包含最新的天氣情況信息* 2. 含有 觀察者集合,使用ArrayList管理* 3. 當(dāng)數(shù)據(jù)有更新時(shí),就主動(dòng)的調(diào)用 ArrayList,通知所有的(接入方)就看到最新的信息。* @author zhaozhaohai**/ public class WeatherData implements Subject{private float temperatrue;private float pressure;private float humidity;private List<Observer> observers;public WeatherData() { this.observers = new ArrayList<Observer>();}public float getTemperature() { return temperatrue;}public float getPressure() { return pressure;}public float getHumidity() { return humidity;}public void dataChange() {//調(diào)用 接入方的 update//currentConditions.update(getTemperature(), getPressure(), getHumidity());notifyObservers();}//當(dāng)數(shù)據(jù)有更新時(shí),就調(diào)用 setDatapublic void setData(float temperature, float pressure, float humidity) {this.temperatrue = temperature;this.pressure = pressure;this.humidity = humidity;//調(diào)用 dataChange, 將最新的信息 推送給 接入方 currentConditions dataChange();}/*** 注冊(cè)一個(gè)觀察者*/@Overridepublic void registerObserver(Observer observer) {// TODO Auto-generated method stubobservers.add(observer);}/*** 移除一個(gè)觀察者*/@Overridepublic void removeObserver(Observer observer) {// TODO Auto-generated method stubobservers.remove(observer);}/*** 遍歷所有的觀察者,并通知*/@Overridepublic void notifyObservers() {// TODO Auto-generated method stubobservers.stream().forEach(item -> {item.update(temperatrue, pressure, humidity);});} } package com.example.demo.observer.improve;public class BaiduSite implements Observer {// 溫度,氣壓,濕度 private float temperature; private float pressure; private float humidity;//更新 天氣情況,是由 WeatherData 來(lái)調(diào)用,我使用推送模式 public void update(float temperature, float pressure, float humidity) {this.temperature = temperature; this.pressure = pressure; this.humidity = humidity; display();}//顯示public void display() {System.out.println("***百度網(wǎng)站 氣溫: " + temperature + "***"); System.out.println("***百度網(wǎng)站 氣壓: " + pressure + "***"); System.out.println("***百度網(wǎng)站 濕度: " + humidity + "***");}} package com.example.demo.observer.improve;public class Client {public static void main(String[] args) {// TODO Auto-generated method stub// 創(chuàng)建一個(gè)WeatherDataWeatherData weatherData = new WeatherData();// 創(chuàng)建觀察者CurrentConditions currentConditions = new CurrentConditions();BaiduSite baiduSite = new BaiduSite();// 注冊(cè)到weatherDataweatherData.registerObserver(currentConditions);weatherData.registerObserver(baiduSite);// 測(cè)試System.out.println(" 通知各個(gè)注冊(cè)的觀察者,看看信息 ");weatherData.setData(10f, 11f, 12f);}}

觀察者模式的好處 :
1)觀察者模式設(shè)計(jì)后,會(huì)以集合的方式來(lái)管理用戶(Observer),包括注冊(cè)、移除和通知。
2)這樣,我們?cè)黾佑^察者(可以理解為一個(gè)新的公告板),就不需要去修改核心類WeatherData不會(huì)修改代碼,遵守類ocp原則。

觀察者模式在JDK應(yīng)用的源碼分析


模式角色分析 :
1)Observable 的作用和地位等價(jià)于,前面的Subject
2)Observable 是類,不是接口,類中已經(jīng)實(shí)現(xiàn)類核心的方法,即管理Observer的方法 add… delete… notify…
3)Observer 的作用和地位等價(jià)于前面的 Observer的update
4)Observable 和 Observer 的使用方法一樣,只是Observable是類,通過(guò)繼承來(lái)實(shí)現(xiàn)觀察者模式

總結(jié)

以上是生活随笔為你收集整理的java 观察者模式_图解Java设计模式之观察者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。