觀察者模式

簡單說兩句

觀察者模式,是對象行爲型模式中的一種,有的時候人們也叫他發佈/訂閱模式。當咱們須要在一個對象狀態改變的時候通知到其它對象,這時候就能夠考慮一下觀察者模式。java

細思不恐

觀察者模式

  • 主旨

在設計模式中,觀察者模式的主旨則是定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並被自動更新。設計模式

  • 解惑

在上面咱們說到,有時觀察者模式也稱發佈/訂閱模式,那到底有啥區別呢?其實發布訂閱模式是處於廣義上的觀察者模式,由於他是最經常使用的一種觀察者模式的實現。安全

發佈訂閱模式相對觀察者多了一個事件的通道,由於在觀察者模式中,觀察者(Observer)須要直接訂閱目標(Subject)事件,在目標發出內容更改事件時,直接接收內容事件並作出響應。在發佈訂閱模式中訂閱者須要從時間的通道中訂閱事件,這樣從發佈者接收事件以及向訂閱者發佈事件,二者並無產生依賴的關係。多線程

具體代碼上的區別,有興趣的朋友能夠在下方留言,下次能夠出一個小分支。異步

  • 實現方式

在上面的介紹中,咱們大概知道了在觀察者模式中,有這麼兩種主角色:ide

  • Subject(被觀察者)

被觀察者必需要有添加觀察者、刪除觀察者和提醒觀察者的方法。測試

  • Observer(觀察者)

觀察者要有更新方法,用來作出響應在狀態改變調用提醒方法後。spa

Java中已經提供了觀察者模式的實現,咱們不須要再定義觀察者和目標接口(被觀察者),也不須要維護觀察者的註冊信息。能夠繼承Observable類實現被觀察者目標對象,實現Observer接口完成具體的觀察者對象,其中提供了update方法獲取相應事件信息。線程

在這裏爲了方便說明觀察者的基本原理,本身實現一個簡單的案例。設計

首先抽象一個觀察者類,裏面有一個抽象方法更新狀態。

public abstract class Oberver{
    public abstract void Update();
}

而後再寫一個抽象被觀察者類。

public abstract class Subject{
    //增長  
    public abstract void Attach(Observer observer);  
    //移除  
    public abstract void Detach(Observer observer);  
    //通知  
    public abstract void Notify();
}

具體上面兩個類:

//具體的觀察者  
public class ConcreteObserver  extends Observer{  

    @Override  
    public void Update() {
        System.out.println("狀態改變,更新狀態");  
    }
}  

//具體被觀察者類  
public class ConcreteSubject extends Subject {  
      
    //定義集合存儲觀察者  
    List<Observer> list=new ArrayList<Observer>();  
      
    //增長觀察者
    @Override  
    public void Attach(Observer observer) {  
        list.add(observer);  
    }  
  
    @Override  
    public void Detach(Observer observer) {  
        list.add(observer);  
    }  
  
    @Override  
    public void Notify() {  
        //遍歷集合觀察者對象  
        for(Observer observer:list){  
            observer.Update();  
        }
    }  
}

接下來咱們就能夠寫測試類了:

public class ObserverDemo {  
    public static void main(String[] args) { 
    
        //建立被觀察者對象  
        ConcreteSubject csb=new ConcreteSubject();  
        //建立觀察者對象
        ConcreteObserver cob=new ConcreteObserver();  
          
        //將觀察者添加到被觀察者的通知名單內  
        csb.Attach(cob);  
          
        //被觀察者發出通知,觀察者接受通知更新狀態  
        csb.Notify();  
    }  
} 

//輸出
「狀態改變,更新狀態」

就這樣,一個簡單的觀察者模式的案例就結束了。固然一個複雜的應用中,咱們確定須要一個完整並且適用與多線程以及異步系統,由於觀察者模式大都應用與這兩中系統,因此也須要考慮線程安全的問題。下次會介紹更加詳細完整的觀察者的實現方式。

寫在最後

由於每一篇的篇幅不宜過長,因此本打字員儘可能在精簡本身所寫的內容,儘可能可以多容擴一些知識點,可是具體的知識橫向擴展可能就有一點欠缺,這也算是對本身的一種鍛鍊,但願你們可以一塊兒進步,怎麼樣,在下面留個言吐槽一下本渣渣吧。(逃

相關文章
相關標籤/搜索