Swift設計模式 – 觀察者模式 (Observer Pattern)

Wood City有一間非常有名的麵包店Wood Bakery,這間麵包店所烘培出來的甜點總是那麼吸引人,特別是他們的Today’s Special讓人連續吃上一個禮拜都不會膩,但每一天的Today’s Special似乎都是為某種口味的愛好者所提供的。

由於Wood Bakery的Today’s Special數量有限,並且出爐的時間也不一定,所以許多企業開始請求Wood Bakery能不能在每一天出爐Today’s Special的時候,通知大家一下。

由於Wood City是一個很早就開始發展IT技術的城市,每一個企業都有自己的網路系統,於是Wood Bakery店長很快就答應了大家,並且開始試運營通知系統。

首先他先邀請FireStation、Hospital、School三家機構進行通知功能的測試,於是三個機構也提供了各自的通知方法:

Wood Bakery的Developer在拿到以後三家的通知方法以後,就馬上撰寫了一個annouceTodaySpecial方法,用來通知這些店家:

Wood City的居民總是充滿著行動力,才沒有幾天就完成了一個基本的通知系統,經過實際操作,看來沒有問題~!


Stone City的市長是一位新上位的市長,他曾經也是Wood City的居民,所以他也曾經是Wood Bakery的粉絲,常常因為能吃上烘培出來的點心而感到滿滿的幸福感,好在Stone City中也是同樣有一家非常出名的Stone Bakery,不然他可能不會搬進這個城市來競選市長了Ha

Stone市長和Wood市長是非常好的兩兄弟,常常都是Wood市長先行進行改革,然後好兄弟Stone市長跟上並且改進。

這次Stone市長決定也協助Stone Bakery製作這個通知系統。當然,想到開發系統,市長第一個想到的就是你和我。

我們在調查Wood Bakery的通知系統時發現這樣的情況:

  • 需要收集大家的接收通知的方法。
  • 當訂閱的名單發生變動的時候,還需要修改Source Code,這是不好的。

光是這兩個問題,就會讓我們兩個非常忙碌了,我們需要有一個便捷的方式。


觀察者模式(Observer Pattern)

觀察者模式定義了一種一對多的依賴關係,讓一個或多個觀察對象監聽其所關心的主題對象。當這個主題對象在自身發生變化的時候,會給所有的觀察者對象發送通知。使用觀察者模式可以讓大量多組對象在較少依賴的情況下實現合作,因此這個模式被廣泛應用。

  • 解決的問題:解決了一個主題與眾多觀察者之間的通訊問題。
  • 優點:此模式允許發送通知的對象在不了解通知的接受者如何處理通知的情況下,以一種統一的方式給接收者發送通知,這有效降低了應用的設計難度。
  • 陷阱:最大的陷阱就是在實現此模式時,讓發送通知的對象和接受通知的對象產生依賴

我們先來定義Observer以及Subject應該要遵從的協議。

先準備一個SubjectBase類別,遵循Subject協議,並且準備一個sendNotifications方法,用來發送消息給所有的觀察者。

然後我們創建一個StoreBakery繼承SubjectBase,當StoreBakery店長要宣布Today’s Special的時候,就會使用到sendNotification來通知大家了~!

接下來就是讓FireStation,Hospital,School遵循Observer協議了。當Observer收到通知的時候,再去調用本地的方法,通知大家可以去買東西了。

我們將school, fireStation, hospital實例化並且加入到Bakery的Observer中,接著請Stone Bakery店長為我們發送一次通知試試看。
我們也同時試試看將fireStation從觀察者名單中去掉,在發送一次通知看看。

從結果看來,實驗成功了!這下想要訂閱和取消訂閱都變得容易好多~!


iOS App開發中的例子

在Cocoa Touch框架中,「通知」和KVO都實現了觀察者模式。


來吧,這是Stone Bakery老闆招待的Today’s Special,辛苦你了,請享用。

最後,在欣賞完煙火以後,可以通過傳送門來看Github上的觀察者模式的例子

2 thoughts on “Swift設計模式 – 觀察者模式 (Observer Pattern)

  1. 發現一個地方筆誤了
    let hospital = StoneFireStation()
    應該是
    let hospital = StoneHospital()

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *