l

2013年8月2日 星期五

重新整理Observer Pattern

August 01 09:00~13:00

螢幕快照 2013-08-01 下午4.41.00

 

今天來整理Observer模式,雖然Observer是一個很常用的模式,但是要言簡意賅地整理成新的格式,過程還是有點小傷腦筋。同樣省略「推理過程」,直接看結果,但今天Teddy寫出兩個版本,一個是「軟體版」,另一個是「生活版」。鄉民看完之後請給點建議,看看哪一個版本比較好。

***

版本一:軟體版

Name:Observer

Context:物件導向設計建議我們將系統切割成一群互相協同合作的物件,以便提高個別物件的可重用性。在這種做法之下,有些物件的狀態與行為會相依於其他物件,並需要因為其他物件的狀態改變而做出反應。

Problem:如何得知物件狀態改變?

Force:

  • 物件狀態異動的頻率無法預料。
  • 為了達到狀態一致性而將物件緊密耦合在一起,將會降低物件的重複使用性。
  • 不能限制資料相依物件的個數,可能有任意數量的物件都有興趣想要知道物件的狀態。
  • 當某物件狀態改變時,其相依物件必須適時自動被通知。

 

Solution:定義一對多的相依關係,當物件改變狀態的時候,讓它的相依者可以自動收到更新通知。此模式規範了兩種角色(介面):擁有狀態的物件(Subject)以及它的相依者(Observer),也就是想得知Subject狀態改變的物件們(Observer可以有一個以上)。

Subject角色允許Observer向它註冊或取消註冊(attach、detach),以便獲得或解除狀態改變的通知。當Subject要將狀態改變的事實通知Observer的時候,Subject會呼叫自己的notify方法通知Observer。Observer角色需實作update方法,以便讓Subject在notify方法中可以通知到各種不同類別的Observer(ConcreteObserver)。

 

螢幕截圖 2014-03-16 22.00.05

螢幕快照 2013-08-01 上午9.36.01

***

版本二:生活版

Name:Observer

Context:你在購物網站上看到一個很熱門且價格超便宜的產品,正當你想要下單購買的時候,你發現這個產品目前「售完補貨中」。

Problem:如何得知商品已到貨?

Force:

  • 你可以定期連回這個網站查詢產品是否到貨,但是這樣做真的很浪費時間。
  • 為了知道商品是否到貨而搬到購物網站的倉庫去住(緊密耦合),是一件很愚蠢的行為。
  • 除了你以外,還有很多人都對這個商品有興趣。
  • 如果商品到貨而你沒有適時地收到通知,你會很火大。

Solution:請購物網站(Subject)提供「貨到通知」功能,讓你(Observer)可以針對有興趣的產品主動加入(attach)到「貨到請通知我」的名單之中。你必須將你的電子郵件地址(update)提供給購物網站,以便貨品到貨的時候購物網站可以立即通知(notify)你。當你對產品不再有興趣的時候,購物網站也要讓你可以從「貨到請通知我」的名單中移除(detach)。

***

Observer是一個很常用而且實作上還算簡單的設計模式,相信大部分的鄉民應該都有使用過的經驗。

友藏內心獨白:沒吃過Observer,也應該看過Observer走路挑眉質疑

4 則留言:

  1. 先看軟體版再看生活版就懂了!
    厲害!

    回覆刪除
  2. 能讓軟體和生活結合在一起,一目了然呢!

    回覆刪除
  3. 作者已經移除這則留言。

    回覆刪除