Observer觀察者設計模式用於將對象的變化通知給感興趣的用戶。在Observer模式中的角色爲主題(subject)與觀察者(observer),觀察者訂閱它感興趣的主題,一個主題能夠被多個觀 察者訂閱,當主題的狀態發生變化時,它必須通知(notify)全部訂閱它的觀察者,觀察者檢視主題的狀態變化,並做出對應的動做,因此Observer模式也稱之爲Publish-Subscribe模式。 Observer觀察者設計模式結構以下: java
觀察者模式順序圖以下: 編程
以一個電子商務網站商品價格變時通知訂閱用戶爲例,演示Observer觀察者設計模式,代碼以下: 設計模式
//主題 interface Subject{ //註冊觀察者 public void registerObserver(Observer o); //註銷觀察者 public void unregisterObserver(Observer o); //通知觀察者 public void notifyObservers(); } //觀察者 interface Observer{ //更新價格信息 public void update(float price); } //商品 class Product implements Subject{ //觀察者列表 private List<Observer> observers = new ArrayList<Observer>(); private float price; public void registerObserver(Observer o){ observers.add(o); } public void unregisterObserver(Observer o){ observers.remove(o); } public void notifyObservers(){ for(Observer observer : observers){ //主題向觀察者推送更新數據 observer.update(price); } } public void priceChanged(){ notifyObservers(); } public void setPrice(float price){ this.price = price; priceChanged(); } } //訂閱者 class Subscriber implements Observer{ private float currentPrice; //觀察者引用主題 private Subject product; public Subscriber(Subject product){ this.product = product; //主題註冊觀察者 product.registerObserver(this); } public void update(float price){ this. currentPrice = price; System.out.println(「Current price change to:」 + currentPrice); } } public class ObserverDemo{ public static void main(String[] args){ Subject product = new Product(); Subscriber subscriber = new Subscriber(product); product.setPrice(10.98); product.setPrice(998.15); } }
在java的java.util中內置了Observer觀察者設計模式,其中: 測試
(1).java.util.Observable是主題類,全部繼承了該類的類是事件發生的主題,也是被觀察的對象。java.util.Observable的經常使用方法有: 網站
a.public void addObserver(Observer o):爲主題添加觀察者。 this
b.publicvoid deleteObserver(Observer o):刪除某個觀察者。 spa
c.publicvoid deleteObservers():刪除主題上的全部觀察者。 設計
d.publicboolean hasChanged():測試主題是否改變。 code
e.protectedvoid setChanged():標記該主題對象已經改變。 server
f.publicvoid notifyObservers():通知全部觀察者對象已經已經改變。
(2).java.util.Observer接口是觀察者,全部實現了該接口的類都是主題事件的觀察者,該接口只有一個方法須要實現:
publicvoid update(Observable o, Object arg):通知觀察者更新已經改變的主題。
使用JDK內置的Observer觀察者設計模式,演示電子商務網站商品價格的例子以下:
//商品 class Product extends Observable{ private float price; public void priceChanged(){ //設置變化點 setChanged(); //通知觀察者 notifyObservers(); } public void setPrice(float price){ this.price = price; priceChanged(); } public float getPrice(){ return price; } } //訂閱者 class Subscriber implements Observer{ private float currentPrice; //觀察者引用主題 private Observable observable; public Subscriber(Observable observable){ this. observable = observable; //主題註冊觀察者 observable.addObserver(this); } public void update(Observable observable, Object arg){ if(observable instanceof Product){ Product product = (Product) observable; this. currentPrice = product.getPrice(); System.out.println(「Current price change to:」 + currentPrice); } } } public class ObserverDemo{ public static void main(String[] args){ Observable product = new Product(); Subscriber subscriber = new Subscriber(product); product.setPrice(10.98); product.setPrice(998.15); } }
Observer觀察者設計模式在界面編程中應用普遍,一個button每每會註冊一個onclickListener,裏面有onclickAction方法對點擊進行響應,此時button充當的就是主題,而onclickListener就是觀察者,而onclickAction就對應着觀察者中對事件進行響應的update方法。
JDK中觀察者模式的應用: