【設計模式】觀察者模式

觀察者模式是定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。

背景:
爲了降低耦合,有了觀察者模式!
書上的例子發展歷程,如下圖:




1、因爲祕書類通知的是看股票類,增加看NBA者後,祕書類也需要修改,這樣一來,就太麻煩了。爲了降低耦合,讓祕書類的參數爲抽象的觀察者,那就可以隨意增加觀察者了。
2、不僅祕書是通知者,還有老闆,所以,祕書類也需要抽象爲通知者類。

    通知者類和觀察者類是兩個抽象類(或接口),其中當通知者發出通知後,所有的觀察者都需要改變狀態;通知者依賴觀察者。
提煉出應用場景:1、 一個對象改變需要同時改變其他對象(具體有多少對象不知道);2、兩個抽象模型,其中一方依賴另一方面。

優點:降低耦合;
缺點:萬一沒有觀察者,通知者的方法無法實現;
原則:依賴倒轉原則;

委託可以很好的避免上述缺點:
原先的Notify依賴observer:
public void  Notify()
{
    foreach(Observer o in observers)
        o.Update();
}
委託後,什麼也不依賴:
public void Notify()
{
    Update();//Update爲聲明的委託事件的名字
}


什麼是委託?
delegate void EventHandler(); //聲明的委託
public event EventHandler Update;//聲明的委託變量
委託是一種引用方法的類型。一旦爲委託分配了方法,委託將於該方法具有完全心相通的行爲。
如:huhansan.Update+=new EventHandler(tongshi1.CloseStockMarket);
實例化一個委託,然後把同事1的關閉股票的方法分配給這個實例化的委託,那麼該委託將具有完全相同的方法,然後,把這個方法給胡漢三的委託。

問題:觀察者模式中通知者和觀察者應該寫爲抽象類還是接口呢?
要想回答這個問題,首先應該知道什麼是抽象類,什麼是接口,及其區別。
抽象類和接口?
抽象類表示的是:這個對象是什麼?如:貓、狗抽象爲“動物'。
接口表示的是:這個對象能做什麼?如:貓能叫、狗也可以叫,把“叫”抽象爲接口。
區別
1、接口中只能有抽象方法;而抽象類可以有非抽象方法,並且可以實現部分功能;
2、一個類可以繼承多個接口,但只能繼承一個抽象類;

感受:在學習設計模式的過程中,慢慢的體會出軟件設計中應該考慮哪些問題,怎麼讓程序易維護、複用、擴展、靈活。我想當我們學習完設計模式以後,不一定會記住多少具體的設計模式,但是,我們會潛移默化的會使用這些模式中的小想法、小原則。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章