Java觀察者模式之實現(xiàn)對象間的一對多依賴
一、介紹
1.1 什么是Java觀察者模式?
Java觀察者模式是一種行為型設(shè)計模式,用于實現(xiàn)對象之間的消息傳遞和通信。在Java中,觀察者模式主要由Observable和Observer接口實現(xiàn)。觀察者模式中的目標對象(Observable)維護一個觀察者列表,當目標對象發(fā)生變化時,它會通知所有的觀察者對象(Observer)進行相應(yīng)的處理。
1.2 觀察者模式的優(yōu)缺點
觀察者模式的優(yōu)點包括:
- 確保了被觀察者和觀察者之間的松耦合,即它們可以獨立地演化而不需要相互了解彼此的細節(jié)。
- 開放-封閉原則。您可以在不改變被觀察者或觀察者代碼的情況下引入新的觀察者。
- 可以為不同的觀察者提供不同的事件通知。具體來說,您可以為某些觀察者提供更詳細的通知,而對于其他觀察者,您可以僅通知狀態(tài)的存在/變化(如僅使用布爾標志)。
觀察者模式的缺點包括:
- 觀察者可能會收到太多通知,其中許多可能不相關(guān)。
- 觀察者之間可能會出現(xiàn)混亂的依賴關(guān)系,從而使代碼更復(fù)雜并增加維護成本。
二、實現(xiàn)步驟
2.1 創(chuàng)建被觀察者類
第一步是創(chuàng)建一個被觀察者類。這通常涉及以下步驟:
- 定義需要通知觀察者的狀態(tài)變量。
- 提供將狀態(tài)變量設(shè)置為新值的方法。
- 提供一種將觀察者添加到觀察者列表中的方法。每次狀態(tài)發(fā)生變化時,都會通知這些觀察者。
- 提供一種將觀察者從觀察者列表中刪除的方法。
2.2 創(chuàng)建觀察者接口和實現(xiàn)類
第二步是定義觀察者接口。觀察者接口應(yīng)該定義被調(diào)用以處理被觀察者發(fā)出的通知的方法。
然后,創(chuàng)建一個或多個實現(xiàn)觀察者接口的類。每個觀察者類應(yīng)該具有一個帶有處理通知的代碼的方法。
2.3 在被觀察者類中添加注冊、移除和通知觀察者的方法
在被觀察者類中添加將觀察者添加到觀察者列表中、將觀察者從觀察者列表中刪除以及通知觀察者的方法。
為了通知觀察者,需要遍歷觀察者列表,對于每個觀察者調(diào)用其處理通知的代碼。
三、應(yīng)用場景
3.1 GUI編程中的應(yīng)用
在GUI編程中,使用Python的socket庫可以實現(xiàn)多用戶聊天室或者網(wǎng)絡(luò)游戲的開發(fā)。服務(wù)器端通過socket監(jiān)聽端口并接受客戶端的連接,同時也可以向客戶端發(fā)送數(shù)據(jù)??蛻舳伺c服務(wù)器端進行交互,通過socket向服務(wù)器發(fā)送信息,同時也可以接收服務(wù)器發(fā)來的信息。
3.2 訂閱服務(wù)
訂閱服務(wù)是指客戶端向服務(wù)器發(fā)送訂閱請求,當服務(wù)器端有新的消息產(chǎn)生時,自動向訂閱該消息的客戶端發(fā)送消息。通過Python的socket庫實現(xiàn)訂閱服務(wù),可以讓客戶端和服務(wù)器實時通信,獲取最新的數(shù)據(jù)。
3.3 股票交易
在股票交易中,需要實現(xiàn)高效的數(shù)據(jù)交互以及實時的數(shù)據(jù)更新。通過Python的socket庫,可以實現(xiàn)股票行情的獲取和交易的下單,同時也可以確保交易的數(shù)據(jù)傳輸安全。對于高頻交易來說,socket還能夠?qū)崿F(xiàn)非阻塞式的多路復(fù)用,提高交易效率。
四、與其他模式的區(qū)別
4.1 觀察者模式與發(fā)布-訂閱模式的區(qū)別
觀察者模式和發(fā)布-訂閱模式都是用于實現(xiàn)對象之間的消息通信。它們的主要區(qū)別在于:
- 觀察者模式中,觀察者直接訂閱并接收目標的信息,目標與觀察者之間是一對多的關(guān)系。而在發(fā)布-訂閱模式中,發(fā)布者與訂閱者之間通過消息代理進行通信,發(fā)布者只需要將消息發(fā)送給消息代理,由消息代理將消息路由給所有訂閱者。
- 在觀察者模式中,目標和觀察者之間是松散耦合的關(guān)系,目標不知道哪些觀察者正在觀察它,觀察者也無法直接控制目標。而在發(fā)布-訂閱模式中,發(fā)布者和訂閱者之間也是松散耦合的關(guān)系,發(fā)布者不知道哪些訂閱者正在訂閱它,訂閱者也無法直接控制發(fā)布者。
4.2 觀察者模式與中介者模式的區(qū)別
觀察者模式和中介者模式都是用于解耦對象之間的關(guān)系。它們的主要區(qū)別在于:
- 觀察者模式中,目標和觀察者之間是直接交互的,觀察者感知到目標狀態(tài)的改變,就會做出響應(yīng)。而在中介者模式中,對象之間不直接交互,它們通過中介者對象進行通信,中介者對象協(xié)調(diào)對象之間的關(guān)系。
- 在中介者模式中,中介者對象負責協(xié)調(diào)對象之間的關(guān)系,中介者對象會成為一個核心,它會成為對象通信的中心。而在觀察者模式中,目標對象負責管理觀察者列表,但是它并不知道觀察者之間的關(guān)系,也不知道觀察者做出響應(yīng)的具體行為。
五、總結(jié)
5.1 Java觀察者模式使用的注意點
在使用Java觀察者模式時,需要注意以下幾點:
- 避免觀察者和目標對象之間的循環(huán)引用,避免內(nèi)存泄漏;
- 觀察者和目標對象都應(yīng)該實現(xiàn)Serializable接口,以便在分布式系統(tǒng)中使用;
- 在多線程情況下,需要保證目標對象和觀察者對象的線程安全,避免多線程問題。
5.2 觀察者模式的適用場景
適用于以下場景:
- 當一個對象的改變需要同時改變其他對象的狀態(tài)時,可以使用觀察者模式。
- 當一個抽象模型有兩個方面,其中一個方面依賴于另一個方面時,可以使用觀察者模式。
- 當一個對象必須通知其他對象,但是其他對象不需要通知它時,可以使用觀察者模式。
5.3 Java觀察者模式的實現(xiàn)方法
在Java中,觀察者模式可以通過Java自帶的Observer和Observable接口來實現(xiàn)。通常需要定義具體的Observer和Observable實現(xiàn)類,并在目標對象中定義添加、移除和通知觀察者的方法。
具體實現(xiàn)方法參考如下代碼:
import java.util.Observable; import java.util.Observer; public class ConcreteObserver implements Observer { // 實現(xiàn)update方法 @Override public void update(Observable observable, Object arg) { // 獲取目標對象傳遞的數(shù)據(jù) String data = arg.toString(); System.out.println("Data has been updated: " + data); } } public class ConcreteObservable extends Observable { public void setData(String data) { // 標記數(shù)據(jù)已發(fā)生改變 setChanged(); // 通知所有觀察者數(shù)據(jù)發(fā)生改變 notifyObservers(data); } } public class Main { public static void main(String[] args) { // 創(chuàng)建一個具體的觀察者對象 ConcreteObserver observer = new ConcreteObserver(); // 創(chuàng)建一個具體的目標對象 ConcreteObservable observable = new ConcreteObservable(); // 將觀察者對象注冊到目標對象中 observable.addObserver(observer); // 向目標對象中添加數(shù)據(jù),并通知所有觀察者數(shù)據(jù)發(fā)生改變 observable.setData("Hello, Observer!"); } }
5.4 如何優(yōu)化觀察者模式的性能
觀察者模式的性能優(yōu)化可以通過以下幾個方面實現(xiàn):
- 利用消息隊列減輕觀察者和目標對象之間的負擔;
- 根據(jù)業(yè)務(wù)需求決定是否允許觀察者接收到所有消息;
- 使用異步通信方式,加快消息傳遞速度;
- 對于緩存的消息,只通知關(guān)鍵觀察者。
以上就是Java觀察者模式之實現(xiàn)對象間的一對多依賴的詳細內(nèi)容,更多關(guān)于Java觀察者模式一對多依賴的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
netty服務(wù)端輔助類ServerBootstrap創(chuàng)建邏輯分析
這篇文章主要介紹了netty服務(wù)端輔助類ServerBootstrap創(chuàng)建邏輯分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03SpringBoot集成ElaticJob定時器的實現(xiàn)代碼
這篇文章主要介紹了SpringBoot集成ElaticJob定時器的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06Java中數(shù)組與集合的相互轉(zhuǎn)換實現(xiàn)解析
這篇文章主要介紹了Java中數(shù)組與集合的相互轉(zhuǎn)換實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08