2010年6月20日 星期日

[DesignPattern] 觀察者模式 (Observer Pattern)

觀察者模式 (Observer Pattern) 定義了物件之間的一對多的關係,當一個物件 (subject/observable) 改變狀態,其他相依物件都會收到通知並做更新。

原則:
  • 設計時盡量讓需要互動的物間之間關係鬆綁(loose-coupling)。讓兩物件可以不知道彼此的實作細節,但透過已知的共通介面互動。

  • 例子:氣象觀測站
  • WeatherData 實作 Subject 介面(或者 java.util.* 中的 observable 介面)讓觀察者(Observer)可以隨時向他註冊(訂閱)新的消息通知,或者取消訂閱。一旦他的狀態改變時,會呼叫 Observer 的 update() 來通知他們有更新發生。
  • 消息的通知又可分為 push 與 pull 兩種,前者由 Subject 把所有資料廣播給所有 Observers,後者只是通知更新,Observers 自己用 Subject 提供的 getter 取得所需的資料。

  • 關係圖:
    (... 閱讀「[DesignPattern] 觀察者模式 (Observer Pattern)」全文)

    [DesignPattern] 策略模式 (Strategy Pattern)

    Strategy Pattern (策略模式) 定義了演算法家族,個別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變動獨立於使用操作的物件之外。

    原則:
  • 把應用中可能變化之處獨立出來,不要和那些不會變化的程式放在一起。
  • 針對介面寫程式,而非針對實踐編程:把實現的部分獨立出來,利用介面做連結,方便以後抽換。(而非透過繼承完成抽象類別的實作)
  • 多用合成(composition),少用繼承:合成是 has-a 的關係,某個物件中有另一個物件作為他的行為。

  • 例子:鴨子
  • Duck 是抽象類別,有各種鴨子繼承它,而在 Duck 之中有兩個行為物件(Quack, Fly),以及 setQuackObj(qObj), setFlyObj(fObj) 的介面可以動態抽換這些行為(演算法)的實作方式。
  • 這些行為(演算法)都是實作 QuackBehavior、 FlyBehavior 介面 (interface) 的類別。

  • 關係圖:
    (... 閱讀「[DesignPattern] 策略模式 (Strategy Pattern)」全文)