观察者模式Observer
初學java的觀察者模式,今天總結了下,希望指正。
觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。
這個主題對象在狀態上發生變化時,會通知所有觀察者對象,讓它們能夠自動更新自己。
?所謂觀察者模式,舉個例子現在許多購房者都密切觀察者房價的變化,當房價變化時,所有購房者都能觀察到,以上的購房者屬于觀察者,這便是觀察者模式。
???????Java中可以借助Observable類和Observer接口輕松實現以上功能。當然此種模式的實現也不僅僅局限于采用這兩個類。
java.util.Observable中有兩個方法對Observer特別重要
1、setChanged()方法
/** 02. * If {@code hasChanged()} returns {@code true}, calls the {@code update()} 03. * method for every observer in the list of observers using null as the 04. * argument. Afterwards, calls {@code clearChanged()}. 05. * <p> 06. * Equivalent to calling {@code notifyObservers(null)}. 07. */ 08.public void notifyObservers() { 09. notifyObservers(null); 10.} 11. 12./** 13. * If {@code hasChanged()} returns {@code true}, calls the {@code update()} 14. * method for every Observer in the list of observers using the specified 15. * argument. Afterwards calls {@code clearChanged()}. 16. * 17. * @param data 18. * the argument passed to {@code update()}. 19. */ 20.@SuppressWarnings("unchecked") 21.public void notifyObservers(Object data) { 22. int size = 0; 23. Observer[] arrays = null; 24. synchronized (this) { 25. if (hasChanged()) { 26. clearChanged(); 27. size = observers.size(); 28. arrays = new Observer[size]; 29. observers.toArray(arrays); 30. } 31. } 32. if (arrays != null) { 33. for (Observer observer : arrays) { 34. observer.update(this, data); 35. } 36. } 37.} 以上兩個方法十分重要
setChanged()方法 ——
用來設置一個內部標志位注明數據發生了變化
notifyObservers()方法 / notifyObservers(Object data)方法 ——
通知所有的Observer數據發生了變化,這時所有的Observer會自動調用復寫好的update(Observable observable, Object data)方法來做一些處理(比如說畫面數據的更新)。
我們可以看到通知Observer有兩個方法,一個無參,一個有參。那么這個參數有什么作用呢?
其中一個作用:現在我不想通知所有的Observer,而只想其中一個指定的Observer做一些處理,那么就可以傳一個參數作為ID,然后在所有的Observer中判斷,每個Observer判斷只有接收到底參數ID是屬于自己的才做一些處理。
當然參數還有其他作用,我只是舉了個例子。
注意: 只有在setChanged()被調用后,notifyObservers()才會去調用update(),否則什么都不干。?????? 示例代碼如下:
import java.util.Observable; import java.util.Observer; class House extends Observable { private float price; public void setPrice(float price) { this.setChanged();// 設置變化點 this.notifyObservers(price);// 通知所有觀察者價格改變 this.price = price; } public float getPrice() { return this.price; } public House(float price) { this.price = price; } public String toString() { return "房子價格為: " + this.price; } } class HousePriceObserver implements Observer { private String name; public HousePriceObserver(String name) { super(); this.name = name; } @Override public void update(Observable o, Object arg) {// 只要改變了 observable 對象就調用此方法 if (arg instanceof Float) { System.out.println(this.name + "觀察的價格更改為:" + ((Float) arg).floatValue()); } } } public class ObserTest { public static void main(String[] args) { House house = new House(1000000); HousePriceObserver hpo1 = new HousePriceObserver("購房者A"); HousePriceObserver hpo2 = new HousePriceObserver("購房者B"); HousePriceObserver hpo3 = new HousePriceObserver("購房者C"); house.addObserver(hpo1);// 給房子注冊觀察者 house.addObserver(hpo2);// 給房子注冊觀察者 house.addObserver(hpo3);// 給房子注冊觀察者 System.out.println(house.toString());//輸出房子價格 // 修改房子價格,會觸發update(Observable o, Object arg)方法通知購房者新的房價信息 house.setPrice(2222222);// System.out.println(house.toString());//再次輸出房子價格 } }
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的观察者模式Observer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java字节码增强探秘
- 下一篇: 面向对象六大原则——单一职责原则