標籤:部分 crete 傳遞 img out notify 通知 推送 訂閱
Java 設計模式系列(十六)觀察者模式(Observer)
觀察者模式是對象的行為模式,又叫發布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
一、觀察者模式的結構
Subject:目標對象,通常具有如下功能:
一個目標可以被多個觀察者觀察
目標提供對觀察者註冊和退訂的維護
當目標的狀態發生變化時,目標負責通知所有註冊的、有效觀察者
Observer:定義觀察者的介面,提供目標式通知時對應的更新方法,這個更新方法進行相應的業務處理,可以在這個方法裡面回調目標對象,以擷取目標對象的資料。
ConcreteSubject:具體的目標實現對象,用來維護目標狀態,當目標對象的狀態發生改變時,通知所有註冊有效觀察者,讓觀察者執行相應的處理。
ConcreteObserver:觀察者的具體實現對象,用來接收目標的通知,並進行相應的後續處理,比如更新自身的狀態以保持和目標的相應狀態一致。
一個目標可以有任意多個觀察者對象,一旦目標的狀態發生了改變,所有註冊的觀察者都會得到通知,然後各個觀察者會對通知作出相應的響應,執行相應的業務功能處理,並使自己的狀態和目標對象的狀態保持一致。
原始碼
_(1) Subject
/** * 目標對象,它知道觀察它的觀察者,並提供註冊和刪除觀察者的介面 */public class Subject { /** * 用來儲存註冊的觀察者對象 */ private List<Observer> observers = new ArrayList<Observer>(); /** * 註冊觀察者對象 * @param observer 觀察者對象 */ public void attach(Observer observer) { observers.add(observer); } /** * 刪除觀察者對象 * @param observer 觀察者對象 */ public void detach(Observer observer) { observers.remove(observer); } /** * 通知所有註冊的觀察者對象 */ protected void notifyObservers() { for(Observer observer : observers){ observer.update(this); } }}
_(2) ConcreteSubject
/** * 具體的目標對象,負責把有關狀態存入到相應的觀察者對象, * 並在自己狀態發生改變時,通知各個觀察者 */public class ConcreteSubject extends Subject { /** * 示意,目標對象的狀態 */ private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; //狀態發生了改變,通知各個觀察者 this.notifyObservers(); }}
_(3) ConcreteSubject
/** * 觀察者介面,定義一個更新的介面給那些在目標發生改變的時候被通知的對象 */public interface Observer { /** * 更新的介面 * @param subject 傳入目標對象,好擷取相應的目標對象的狀態 */ public void update(Subject subject);}
_(4) ConcreteSubject
/** * 具體觀察者對象,實現更新的方法,使自身的狀態和目標的狀態保持一致 */public class ConcreteObserver implements Observer { /** * 示意,觀者者的狀態 */ private String observerState; public void update(Subject subject) { // 具體的更新實現 //這裡可能需要更新觀察者的狀態,使其與目標的狀態保持一致 observerState = ((ConcreteSubject)subject).getSubjectState(); }}
二、Java 提供的觀察者模式
其中 Observer 和 Observable 是 java.util 下的包。
(1) ConcreteSubject
public class ConcreteSubject extends Observable { /** * 示意,目標對象的狀態 */ private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; //狀態發生了改變,通知各個觀察者 this.setChanged(); this.notifyObservers(subjectState); }}
(2) ConcreteObserver
public class ConcreteObserver implements Observer { /** * 示意,觀者者的狀態 */ private String observerState; @Override public void update(Observable o, Object obj) { //這是採用推的方式 System.out.println("目標推過來的內容是:" + obj); //這是擷取拉的資料 System.out.println("主動到目標對象去拉的內容是:" + ((ConcreteSubject)o).getSubjectState()); }}
三、總結(1) 推模型和拉模型
在觀察者模式中,又分為推模型和拉模型兩種方式。
每天用心記錄一點點。內容也許不重要,但習慣很重要!
Java 設計模式系列(十六)觀察者模式(Observer)