1. 程式人生 > >觀察者模式簡談

觀察者模式簡談

理解觀察者模式

在日常生活中,當某件事發生時,應該通知所有相關者。例如,如果我們的課程改變時間或地點,就應該通知所有學習這門課程的同學。

在軟體設計中,當一個物件的狀態發生變化時,需要通知與其相關的其他所有物件,而且不用修改該物件程式碼。

圖解觀察者模式

  

 

包含的角色

Subject:主題

ConcreteSubject:具體主題

Observer:觀察者

ConcreteObserver:具體觀察者

優缺點

     優點:

                  觀察者和被觀察者是抽象耦合的;

                  建立一套觸發機制;

     缺點:

                  如果一個被觀察者物件有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間;

                  如果在觀察者和觀察目標之間有迴圈依賴的話,觀察目標會觸發它們之間進行迴圈呼叫,可能導致系統崩潰;

                  觀察者模式沒有相應的機制讓觀察者知道所觀察的目標物件是怎麼發生變化的,而僅僅只是知道觀察目標發生了變化;

目的

一個物件狀態改變給其他物件通知的問題,而且要考慮到易用和低耦合,保證高度的協作。

經典應用場景

拍賣的時候,拍賣師觀察最高標價,然後通知給其他競價者競價。

java的程式碼實現

public abstract class Subject {
     //定義一個觀察者陣列
     private Vector<Observer> obsVector = new Vector<Observer>();
     //增加一個觀察者
     public void addObserver(Observer o){
             this.obsVector.add(o);
     }
     //刪除一個觀察者
     public void delObserver(Observer o){
             this.obsVector.remove(o);
     }
     //通知所有觀察者
     public void notifyObservers(){
             for(Observer o:this.obsVector){
                     o.update();
             }
     }
}

總結

使用場景一般滿足的條件:

1)一個抽象模型有兩個方面,其中一個方面依賴於另一個方面。將這些方面封裝在獨立的物件中使它們可以各自獨立地改變和複用。

2)一個物件的改變將導致其他一個或多個物件也發生改變,而不知道具體有多少物件將發生改變,可以降低物件之間的耦合度。

3)一個物件必須通知其他物件,而並不知道這些物件是誰。

4)需要在系統中建立一個觸發鏈,A物件的行為將影響B物件,B物件的行為將影響C物件……,可以使用觀察者模式建立一種鏈式觸發機制。