Java觀察者模式的應用與解析

Java觀察者模式是一種常用的設計模式,它的應用使得我們可以通過在對象之間建立一對多依賴關係來實現消息通信。在本篇文章中,我們將通過三個方面對Java觀察者模式做詳細的闡述:

一、觀察者模式代碼剖析

1、觀察者模式的定義

  /**
   * The Observable class represents an observable object.
   * An observable object can have one or more observers. 
   * An observer may be any object that implements interface Observer.
   * After an observable instance Changes, an application calling the 
   * Observable's notifyObservers method causes all of its observers 
   * to be notified of the change by a call to their update method.
   */
  public class Observable {
      ...
  }
  
  /**
   * The Observer interface is implemented by objects that observe 
   * Observable objects.
   */
  public interface Observer {
      /**
       * This method is called whenever the observed object is changed.
       * An application calls an Observable object's notifyObservers 
       * method to have all the object's observers notified of the change.
       */
      void update(Observable o, Object arg);
  }

2、Java觀察者模式的實現

  // 步驟1: 創建一個被觀察的對象
  public class ObservableObject extends Observable {
      ...
      // 步驟2: 添加一個觀察者
      public void addObserver(Observer o) {
          ...
      }
      ...
      // 步驟3: 當對象狀態發生改變時,通知所有觀察者
      public void notifyObservers(Object arg) {
          ...
      }
  }
  
  // 步驟4: 創建觀察者
  public class ObserverObject implements Observer {
      ...
      // 步驟5: 實現觀察者的更新方法
      public void update(Observable o, Object arg) {
          ...
      }
  }

二、觀察者模式類圖分析

1、觀察者模式的類圖

2、類圖分析

Subject(被觀察者):它是指被觀察的對象。它需要註冊觀察者,以便在發生特定事件時通知觀察者。

ConcreteSubject(具體被觀察者):它是指具體的被觀察者對象,它包含了具體的業務邏輯,並且在狀態發生改變時,向它的觀察者發出通知。

Observer(觀察者):它是指觀察者的抽象。在接收到被觀察者的通知後,觀察者通過update()方法進行響應。

ConcreteObserver(具體觀察者):它是指具體的觀察者對象,具體實現了抽象觀察者中定義的update()方法,在得到被觀察者通知時進行更新自己的狀態。

三、Java觀察者模式的應用

1、Java觀察者模式的優點

(1)觀察者模式解耦了待觀察和觀察者之間的耦合。

(2)Java觀察者模式支持廣播通信。

(3)觀察者模式支持任意數量的觀察者。

(4)Java觀察者模式遵循了開閉原則。

2、Java觀察者模式的缺點

(1)建立Java觀察者模式需要額外的抽象層。

(2)Java觀察者模式可能導致意外更新。

(3)Java觀察者模式需要全面的測試。

3、Java觀察者模式的實現方式

(1)通過繼承Observable類和實現Observer接口實現觀察者模式。

(2)通過回調函數模式實現觀察者模式。

(3)通過消息隊列模式實現觀察者模式。

以上就是關於Java觀察者模式的詳細闡述,相信通過本文的介紹,讀者已經能夠對Java觀察者模式進行初步的了解,從而更好地進行實踐和運用。

附:觀察者模式Java代碼示例

// Java觀察者模式實現代碼
public class ObserverPatternTest {
    public static void main(String[] args) {
        // 步驟1: 創建一個被觀察的對象
        ObservableObject observable = new ObservableObject();

        // 步驟2: 添加觀察者
        observable.addObserver(new ObserverObject());

        // 步驟3: 當對象狀態發生改變時,通知所有觀察者
        observable.notifyObservers("Object has changed!");
    }
}

// 被觀察者
public class ObservableObject extends Observable {
    public void notifyObservers(Object arg) {
        setChanged();
        super.notifyObservers(arg);
    }
}

// 觀察者
public class ObserverObject implements Observer {
    public void update(Observable o, Object arg) {
        System.out.println("Object has changed!");
    }
}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/283151.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 08:07
下一篇 2024-12-22 08:07

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論