定義
觀察者模式定義了物件之間的一對多關係。當一個物件改變狀態,其他相依者都會收到通知並自動被更新。
- 主題和觀察者定義了一對多的關係。觀察者相依於主題,只要主題狀態一有變動,就會通知觀察者。
看情況和需求決定,觀察者也可能因此新值而有所更新。
- 主題是具有狀態的物件,且可以控制這些狀態。觀察者使用這些狀態,雖然這些狀態不屬於他們,
但是依賴主題告訴他們狀態何時改變了。
- 主題更新觀察者的方式,是透過一個共同的介面
- 觀察者取得主題資料的方式可以透過 push or pull
- 當狀態有變動時,由主題將資料 "push"給觀察者:
優:觀察者不需知道主題資料細節,可一次取得資料,不需多次呼叫
缺:一次取得一大包資料,可能只需其中部分資料
- 當狀態有變動時,主題通知觀察者資料變動,由觀察者自行跟主題pull需要的資料:
優:不需一次取得一大包資料
缺:需知道主題資料並多次呼叫
- JAVA內建觀察者模式
- 主題Observable 是一個類別,不是一個介面,實體主題擴充自Observable類別,
並繼承一些增加、刪除、通知觀察者的方法。
- 實體觀察者實踐Observer介面
設計守則
- 設計時,盡量讓需要互動的物件之間關係鬆綁。
- 當兩個物件之間被鬆綁,他們依然可以互動,但是不太清楚彼此的細節。
重點在Loose Couple。
Message Queue是這個pattern的典型應用,以Active MQ來說,push就是它的Queue,pull就是它的Topic。
Observer pattern有非同步機制的效果,UI上有許許多多的應用(event-listen)。