1. 程式人生 > >HeadFirst 設計模式筆記(二)—— observer

HeadFirst 設計模式筆記(二)—— observer

觀察者模式:定義了物件間的一對多依賴,當一個物件有新的訊息,所有與之關聯的物件都將得到通知。這是一個非常常用的模式,它能使我們的物件知悉現狀。就像報社與訂報人之間的關係:
  1. 使用者可以隨時決定訂閱或取消訂閱。
  2. 一旦使用者訂閱了報紙,那麼新一期的報紙只要一出版就會被送上門。

為了展示這個模式的應用,我們假設有兩個類:Observer和Suject(被觀察者,主題)。


Subject中:
  • 需要維護一個列表,由所有的Observer組成。
  • 實現addObserver/removeObserver實現觀察者的註冊和登出
  • 實現notifyObserver方法,每當出現新的訊息,我們遍歷已註冊的Observer列表,並逐一通知它們(呼叫他們的update方法)
Observer中:
  • 為了把自己註冊到感興趣的Subject上,需要呼叫Subject的addObserver方法,為此可以將Subject作為構造引數,也可以使用其他方法。
  • 實現update方法,供Subject呼叫,即在有新訊息時作何處理。
  • 不再對此Subject感興趣時可以把自己從Subject登出,使用Subject的removeObserver方法。

Java中對觀察者模式提供了內建支援:Obserser類可以實現介面java.util.Observer; Subject類可以擴充套件java.util.Observable類。


注意:java api中提供的這種方式存在一些問題:
  • Observable是一個類而不是介面,這使得我們不得不通過繼承它來使用,而java是不支援多繼承的,當我們需要另一個基類時這有可能帶來不便。
  • 根據java中的實現,列表中的observer物件被通知的順序是不確定的,我們不能依賴這一順序。

總之,有必要時請自行實現這一模式,它並不太複雜!


PS:通知的傳遞方式有兩種:“推”和“拉”。根據update方法的引數,我們可以選擇把suject作為引數傳給observer,由它自行獲取感興趣的資訊;或者把subject想提供的資訊直接傳給observer。