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