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

Java觀察者模式之實現(xiàn)對象間的一對多依賴

 更新時間:2023年05月08日 09:51:34   作者:陳書予  
這篇文章主要介紹了Java觀察者模式之實現(xiàn)對象間的一對多依賴的方法,Java觀察者模式是一種行為型設(shè)計模式,用于實現(xiàn)對象之間的消息傳遞和通信,文中有詳細的實現(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)文章

  • 微信小程序與Java后端接口交互

    微信小程序與Java后端接口交互

    本文主要介紹了微信小程序與Java后端接口交互,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Java 什么是注解及注解原理詳細介紹

    Java 什么是注解及注解原理詳細介紹

    這篇文章主要介紹了Java 注解的原理實例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Java導(dǎo)出txt文件的方法

    Java導(dǎo)出txt文件的方法

    這篇文章主要介紹了Java導(dǎo)出txt文件的方法,實例分析了兩種java導(dǎo)出txt文本文件的使用技巧,需要的朋友可以參考下
    2015-05-05
  • netty服務(wù)端輔助類ServerBootstrap創(chuàng)建邏輯分析

    netty服務(wù)端輔助類ServerBootstrap創(chuàng)建邏輯分析

    這篇文章主要介紹了netty服務(wù)端輔助類ServerBootstrap創(chuàng)建邏輯分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • Java集合操作之List接口及其實現(xiàn)方法詳解

    Java集合操作之List接口及其實現(xiàn)方法詳解

    這篇文章主要介紹了Java集合操作之List接口及其實現(xiàn)方法,詳細分析了Java集合操作中List接口原理、功能、用法及操作注意事項,需要的朋友可以參考下
    2015-07-07
  • SpringBoot集成ElaticJob定時器的實現(xiàn)代碼

    SpringBoot集成ElaticJob定時器的實現(xiàn)代碼

    這篇文章主要介紹了SpringBoot集成ElaticJob定時器的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java如何判斷字符串中是否包含某個字符

    Java如何判斷字符串中是否包含某個字符

    這篇文章主要介紹了Java如何判斷字符串中是否包含某個字符,可以使用String類的contains()方法,另一種方法使用String類的indexOf方法,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • java中對字符串每個字符統(tǒng)計的方法

    java中對字符串每個字符統(tǒng)計的方法

    java中對字符串每個字符統(tǒng)計的方法,需要的朋友可以參考一下
    2013-03-03
  • Java中數(shù)組與集合的相互轉(zhuǎn)換實現(xiàn)解析

    Java中數(shù)組與集合的相互轉(zhuǎn)換實現(xiàn)解析

    這篇文章主要介紹了Java中數(shù)組與集合的相互轉(zhuǎn)換實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Spring中基于xml的AOP的詳細步驟

    Spring中基于xml的AOP的詳細步驟

    這篇文章主要介紹了Spring中基于xml的AOP的詳細步驟,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06

最新評論