今天就不用廢話了XD

來看看觀察者模式吧

 

這個模式的行為上其實很簡單,就是一個一對多廣播的概念

常見的舉例有開報社跟訂閱者的例子

如果訂閱者有跟報社訂購報紙,那麼報社在有報紙的時候就會發給每個訂閱者

訂閱者如果不想訂報紙的話,也可以申請取消,那麼之後報社就不會再發報紙給他了

 

那麼基本上會有subject和observer兩個介面,就是報社和訂閱者的角色

subject的介面大概會有以下的內容:

void registerObserver(*observer o);  // 註冊觀察者

void removeObserver(*observer o);  // 移除觀察者

void notifyObservers();  // 通知每個觀察者

vector<*observer> m_observers;  // 存放有註冊的觀察者們

 

其實也不難理解吧,再來是observer:

void update(...)  // 更新內容

 

所以一般來說呢,notifyObservers()的實作大概會長這樣:

void notifyObservers() {

    data = collectData(); // 獲取資料,這邊就以data代稱好了

    for (*observer o : m_observers) {  // 更新每個觀察者

        o->update(data);

    }

}

 

好吧大概就這樣了,是比較好理解的一種模式XD

那麼這樣做的好處是什麼呢

1. 這樣等於是讓兩個物件之間被鬆綁,subject不需要知道observer的實作或其他內容,只要知道observer的一些固定介面就好了

2. 當有新的observer出現的時候,subject並不用作對應的修改,只要維持本來的程式碼就可以了

3. 任何地方都可以使用subject或observer,兩者不用被綁在一起使用

4. 如果兩邊有一邊需要修改的話,只要不影響介面,另一邊都是不用更動的

 

其實就是遵從一個原則:盡量讓互動的物件之間的關係鬆綁

也很符合設計的守則

找出程式中會變動的部分:subject的狀態以及observer的數量和型態

針對介面寫程式:物件之間只需要互相知道介面就可以運作

多用合成少用繼承:subject和observer之間的關係不是利用繼承產生的,而是執行期的時候才用合成的方式產生的

 

很棒吧,我以前真的覺得繼承很無敵

現在開始覺得指用繼承有點... 無腦了XD

還是有很多方式可以讓程式更好維護更自由的

那這篇就這樣了,下一個設計模式再見~~~XD

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 頁頁頁六滴 的頭像
    頁頁頁六滴

    人森很精彩,所以要把所有事情都記起來=ˇ=

    頁頁頁六滴 發表在 痞客邦 留言(0) 人氣()