Java設(shè)計(jì)模式之觀察者模式observer?pattern詳解
觀察者模式
簡(jiǎn)介:
當(dāng)一個(gè)對(duì)象發(fā)生數(shù)據(jù)變化時(shí),通知其他相關(guān)的一系列對(duì)象,接受到通知的對(duì)象根據(jù)該對(duì)象的變化進(jìn)行相應(yīng)處理以響應(yīng)變化的過程。
概念解析:
其實(shí)與ActiveMQ、RabbitMQ等中間件的基本運(yùn)行模式相類似,觀察者模式的基礎(chǔ)構(gòu)建方式非常相近,其分為觀察者與被觀察者兩個(gè)部分。
(一)觀察者:從字面上看也就是指進(jìn)行觀察的對(duì)象,對(duì)應(yīng)來說也就是消息訂閱者;
(二)被觀察者:當(dāng)然被觀察者也就是指被觀察的對(duì)象,相應(yīng)的角色也就是消息發(fā)布者。
運(yùn)行方式:
推:消息以類似廣播的形式通知觀察者,觀察者只能被動(dòng)、無條件接受;
拉:接收到被觀察者的通知,可以自主決定獲取消息。
觀察者模式的實(shí)現(xiàn)
兩種方式實(shí)現(xiàn)觀察者設(shè)計(jì)模式的實(shí)現(xiàn),具體如下:
【1】手寫觀察者設(shè)計(jì)模式
【2】Java API 提供的觀察者設(shè)計(jì)模式 使用 Java API 提供的 Observer 和 Observeable 實(shí)現(xiàn)觀察者模式
手寫觀察者設(shè)計(jì)模式
編寫被觀察對(duì)象:subject.java

編寫觀察者接口,起到統(tǒng)一規(guī)范作用.

實(shí)現(xiàn)Observer接口,我們可以有一個(gè)或多個(gè)觀察者對(duì)一個(gè)subject進(jìn)行觀察

編寫主類,進(jìn)行運(yùn)行展示

運(yùn)行接口展示:

通過API實(shí)現(xiàn)觀察者模式
通過繼承Observable父類,構(gòu)建一個(gè)被觀察者

實(shí)現(xiàn)Observer創(chuàng)建一個(gè)觀察者類

通過編寫主類測(cè)試類觀察結(jié)果:

觀察者模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):觀察者與被觀察者抽象耦合,可定義一種穩(wěn)定的消息觸發(fā)機(jī)制。 缺點(diǎn):如果被觀察者有多個(gè)間接的觀察者,消息的傳遞將消耗更多時(shí)間,如果觀察者與被觀察者之間循環(huán)依賴,最終會(huì)導(dǎo)致系統(tǒng)崩潰。也正因如此與隊(duì)列消息相類似,我們一般會(huì)單獨(dú)開一個(gè)線程讓其進(jìn)行運(yùn)行,以避免程序堵塞,不能運(yùn)行的尷尬。
使用場(chǎng)景:
一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面依賴于另一個(gè)方面。將這些方面封裝在獨(dú)立的對(duì)象中使它們可以各自獨(dú)立地改變和復(fù)用。 一個(gè)對(duì)象的改變將導(dǎo)致其他一個(gè)或多個(gè)對(duì)象也發(fā)生改變,而不知道具體有多少對(duì)象將發(fā)生改變,可以降低對(duì)象之間的耦合度。 一個(gè)對(duì)象必須通知其他對(duì)象,而并不知道這些對(duì)象是誰。 需要在系統(tǒng)中創(chuàng)建一個(gè)觸發(fā)鏈,A對(duì)象的行為將影響B(tài)對(duì)象,B對(duì)象的行為將影響C對(duì)象……,可以使用觀察者模式創(chuàng)建一種鏈?zhǔn)接|發(fā)機(jī)制。
注意事項(xiàng):
1、JAVA 中已經(jīng)有了對(duì)觀察者模式的支持類。
2、避免循環(huán)引用。
3、如果順序執(zhí)行,某一觀察者錯(cuò)誤會(huì)導(dǎo)致系統(tǒng)卡殼,一般采用異步方式。
到此這篇關(guān)于Java設(shè)計(jì)模式之觀察者模式observer pattern詳解的文章就介紹到這了,更多相關(guān)Java觀察者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Spring Boot和Kotlin的聯(lián)合開發(fā)
這篇文章主要介紹了關(guān)于Spring Boot和Kotlin的聯(lián)合開發(fā),需要的朋友可以參考下2017-06-06
如何解決@value獲取不到y(tǒng)aml數(shù)組的問題
文章介紹了在使用YAML配置文件時(shí),通過@Value注解獲取整數(shù)和數(shù)組列表的配置方法,并提供了兩種解決方案:一種適用于非嵌套列表,另一種適用于嵌套列表等復(fù)雜配置2024-11-11
Springboot使用pdfbox提取PDF圖片的代碼示例
PDFBox是一個(gè)用于創(chuàng)建和處理PDF文檔的Java庫,它可以使用Java代碼創(chuàng)建、讀取、修改和提取PDF文檔中的內(nèi)容,本文就給大家介紹Springboot如何使用pdfbox提取PDF圖片,感興趣的同學(xué)可以借鑒參考2023-06-06
淺談Mybatis中resultType為hashmap的情況
這篇文章主要介紹了淺談Mybatis中resultType為hashmap的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
javaweb實(shí)現(xiàn)投票系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了javaweb實(shí)現(xiàn)投票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
Java使用Sharding-JDBC分庫分表進(jìn)行操作
Sharding-JDBC 是無侵入式的 MySQL 分庫分表操作工具,本文主要介紹了Java使用Sharding-JDBC分庫分表進(jìn)行操作,感興趣的可以了解一下2021-08-08
java讀取配置文件(properties)的時(shí)候,unicode碼轉(zhuǎn)utf-8方式
這篇文章主要介紹了java讀取配置文件(properties)的時(shí)候,unicode碼轉(zhuǎn)utf-8方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Idea報(bào)錯(cuò): A JNI error has occurred的問題
這篇文章主要介紹了Idea報(bào)錯(cuò): A JNI error has occurred的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Java數(shù)據(jù)結(jié)構(gòu)順序表的詳細(xì)講解
大家好,今天給大家?guī)淼氖琼樞虮?,我覺得順序表還是有比較難理解的地方的,于是我就把這一塊的內(nèi)容全部整理到了一起,希望能夠給剛剛進(jìn)行學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的人帶來一些幫助,或者是已經(jīng)學(xué)過這塊的朋友們帶來更深的理解,我們現(xiàn)在就開始吧2022-05-05

