今天就不用廢話了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