標籤:java
一.觀察者模式:
(1).觀察者模式定義:定義了一種一對多的依賴關係,讓多個觀察者監聽某個主體對象。當主題對象發生改變時,則會通知所有的觀察者對象,讓它們自動更新自己。
(2).觀察者模式的組成:
a).具體主題角色:在具體主題角色內部發生變化時,給所有註冊過的觀察者發出通知。(通常使用一個類實現)
b).抽象主題角色:把所有觀察者對象的引用儲存的在一個集合中,每個抽象主題角色都可以有任意個觀察者,一般用抽象類別或介面實現。
c).抽象觀察者角色:為具體的觀察者定義一個介面,在得到主題通知時更新自己。
d).具體觀察者角色:實現抽象觀察者角色所要求的更新介面。
二.實現自己的觀察者模式:
1).抽象主題角色:
//被觀察的,就是抽象主題角色public interface Watched { //增加觀察者public void addWatcher(Watcher watcher);//刪除觀察者public void removeWatcher(Watcher watcher);//通知觀察者public void notifyWatchers(String str);}
2).抽象觀察者角色:
//觀察的,就是抽象觀察者角色public interface Watcher {//更新自己public void update(String str);}
3).具體主題角色:
//具體主題角色public class ConcreteWatched implements Watched { //儲存觀察者private List<Watcher> list = new ArrayList<Watcher>();@Overridepublic void addWatcher(Watcher watcher) {list.add(watcher);}@Overridepublic void removeWatcher(Watcher watcher) {list.remove(watcher);}@Overridepublic void notifyWatchers(String str) {//通知觀察者for(Watcher watcher :list){watcher.update(str);}}}
4).具體觀察者角色:
//具體觀察者角色public class ConcreteWatcher implements Watcher{//實現介面的更新方法@Overridepublic void update(String str) {System.out.println(str);}}
5).測試:
public class index {public static void main(String[] args) {Watched w = new ConcreteWatched();Watcher r1 = new ConcreteWatcher();Watcher r2 = new ConcreteWatcher();Watcher r3 = new ConcreteWatcher();w.addWatcher(r1);w.addWatcher(r2);w.addWatcher(r3); w.notifyWatchers("哈哈");}}
列印:
哈哈
哈哈
哈哈
三.JDK對觀察者的內建支援:
1).在jdk中提供了Observable類和Observer介面:
Observable類用於建立可以觀測到你的程式中其他部分的子類。當這種子類發生變化時通知其觀察者。觀察類必須實現了Observer介面的update()方法。
2).必須調用的方法:
一個被觀察的對象發生改變時必須調用setChandeg()方法,在通知觀察者時必須調用notifyObservers()方法。如果在通知觀察者時未調用setChandeg()方法則就不會有任何的響應。
3).notifyObservers()方法有兩種形式:
一個是帶參數的一個是不帶參數的。帶參數的方法,其參數就是傳給update()的第二個參數。
簡單實現:
//被觀察者class BeingWatched extends Observable{public void observerName(String str){//由false變為true,表示我可以發出通知了。this.setChanged();//通知觀察者this.notifyObservers(str);}}//觀察者對象一class Watcher1 implements Observer{@Overridepublic void update(Observable o, Object arg) {System.out.println(arg.toString()+"Watcher1");}}//觀察者對象二class Watcher2 implements Observer{@Overridepublic void update(Observable o, Object arg) {System.out.println(arg.toString()+"Watcher2");}}public class ObservableTest {public static void main(String[] args) {BeingWatched watched = new BeingWatched();Watcher1 w1 = new Watcher1();Watcher2 w2 = new Watcher2();watched.addObserver(w1);watched.addObserver(w2);watched.observerName("我是觀察者:");}}
列印:
我是觀察者:Watcher2我是觀察者:Watcher1
四.觀察者的適用:
1). 對一個對象狀態的更新,需要其他對象同步更新,而且其他對象的數量動態可變。
2). 對象僅需要將自己的更新通知給其他對象而不需要知道其他對象的細節。
java(23) - 觀察者模式