行爲模式---之--觀察者模式

觀察者模式是對象的行爲模式,又叫作發佈-訂閱(Publish/Subscribe)模式,模型-視圖(Model/View)模式,源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知全部觀察者對象,使它們可以自動更新本身。
 
觀察者模式的角色:
1.抽象主題(Subject)角色:主題角色把全部對觀察者的引用保存在一個聚焦裏,每一個主題均可以有任何數量的觀察者。抽象主題角色提供一個接口,能夠增長和刪除觀察者對象,主題角色又叫作抽象被觀察者角色,通常用一個抽象類或接口實現
2.抽象觀察者(Observer)角色:爲全部的具體觀察者定義一個接口,在獲得主題的通知時更新本身。這個接口叫作更新接口。抽象觀察者角色通常用一個抽象類或一個接口實現
3.具體主題(ConcreteSubject)角色:將有關狀態存入具體觀察者對象,在具體主題的內部狀態改變時,給全部登記過的觀察者發出通知。它又叫作具體被觀察者角色。
4.具體觀察者(ConcreteObserver)角色:存儲與主題的狀態自恰的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新接口,以便使自己的狀態與主題的狀態相協調。若是須要,具體觀察者角色能夠保存一個指向具體主題對象的引用。
 
示例代碼:
 1 public class ObservationTest {
 2     public static void main(String[] args) {
 3         Subject1 subject = new ConcreteSubject();
 4         Observer observer = new ConcreteObserver();
 5         subject.attach(observer);
 6         subject.notifyObserver();
 7     }
 8 
 9 }
10 
11 //抽象主題角色
12 interface Subject1{
13     //調用 這個方法登記一個新 的觀察者對象
14     public void attach(Observer observer);
15     //調用這個方法刪除一個已經登記過的觀察者對象
16     public void delete(Observer observer);
17     //調用這個方法通知全部登記過的觀察者對象
18     public void notifyObserver();
19 }
20 //具體主題角色  也能夠把對聚焦的維護方法上移到抽象主角角色中
21 class ConcreteSubject implements Subject1{
22     private Vector observers = new Vector();
23 
24     @Override
25     public void attach(Observer observer) {
26         observers.add(observer);
27     }
28 
29     @Override
30     public void delete(Observer observer) {
31         observers.remove(observer);
32     }
33 
34     @Override
35     public void notifyObserver() {
36         for(int i=0;i<observers.size();i++){
37             Observer o = (Observer)observers.get(i);
38             o.update();
39         }
40     }
41     
42 }
43 
44 //抽象觀察者
45 interface Observer{
46     //調用這個方法會更新本身
47     public void update();
48 }
49 //具體觀察者
50 class ConcreteObserver implements Observer{
51     //調用這個方法更新本身
52     @Override
53     public void update() {
54         System.out.println("I am notified");
55     }
56     
57 }

 

Java語言對觀察者模式的支持:
在Java語言的java.util庫裏,提供了一個Observable類及一個Observer接口,構成Java語言對觀察者模式的支持。
Observer接口,這個接口只定義了一個方法update()方法。當被觀察者對象的狀態發生變化時,被觀察者對象的notifyObservers()方法就會調用這一方法。
 
Observable類
被觀察者類就是java.util.Observable類的子類。java.util.Observable提供公開的方法支持觀察者對象,這些方法中有兩個對Observable的子類很是重要:一個是setChanged()調用以後會設置一個內部標記變量,表明被觀察者對象的狀態發生了變化,另外一個是notifyObservers(),這個方法被調用時,會調用全部登記過的觀察者對象的update()方法,使這些觀察者對象能夠更新本身。
一個示例:
 1 public class JavaObservation {
 2 
 3     public static void main(String[] args) {
 4         //建立被觀察者對象
 5         Watched watched = new Watched();
 6         //建立觀察者對象,並將被觀察者對象登記
 7         Watcher watcher = new Watcher(watched);
 8         //給被觀察者對象的狀態賦值4次
 9         watched.changeData("A");
10         watched.changeData("B");
11         watched.changeData("C");
12         watched.changeData("D");
13     }
14 
15 }
16 
17 //具體主題
18 class Watched extends Observable{
19     private String data = "";
20     //取值方法
21     public String retrieveData(){
22         return data;
23     }
24     //改值方法
25     public void changeData(String data){
26         if(!this.data.equals(data)){
27             this.data = data;
28             //標記值已改變
29             setChanged();
30         }
31         //通知觀察者
32         notifyObservers();
33     }
34 }
35 //具體觀察者
36 class Watcher implements Observer{
37     //把觀察者加入到觀察列表
38     public Watcher (Watched w){
39         w.addObserver(this);
40     }
41     //更新方法
42     @Override
43     public void update(Observable o, Object arg) {
44         System.out.println("Data has been changed to:"+((Watched)o).retrieveData());
45     }
46     
47 }

觀察者模式的優勢java

1.觀察者模式在被觀察者之間創建一個抽象的耦合。被觀察者所知道的只是一個具體觀察者聚焦,每個具體觀察者都符合一個抽象觀察者的接口。被觀察者並不認識任何一個具體觀察者,它只知道它們都有一個共同的接口。因爲被觀察者和觀察者沒有緊密地耦合在一塊兒,所以它們能夠屬於不一樣的抽象化層次。若是被觀察者和觀察者都被扔到一塊兒,那麼這個對象必然跨越抽象化和具體化層次。異步

2.觀察者模式支持廣播通訊。被觀察者會向全部的登記過的觀察者發出通知。ide

觀察者模式的缺點:
1.若是一個被觀察者對象有不少直接和間接的觀察者的話,將全部的觀察者都通知會花費不少時間
2.若是在被觀察者之間有循環依賴的話,被觀察者會觸發它們之間進行循環調用,致使系統崩潰。在使用觀察者模式時要特別注意這一點
3.若是對觀察者的通知是經過另外的線程進行異步投遞的話,系統必須保證投遞是以自恰的方式進行的
4.雖然觀察者模式能夠隨時使用觀察者知道所觀察的對象發生了變化,可是觀察者模式沒有相應的機制使觀察者知道所觀察的對象是怎麼發生變化的。
相關文章
相關標籤/搜索