Observer Pattern

如何讓妹子們自動收到我的貼文?

最近煩惱著這樣的一個問題。

前言

最近我正思考著如何讓所有妹子們隨時收到我的貼文,希望她們可以幫我的貼文按按讚,支持我這個鄉下來的人。但問題一是妹子們來來去去的,流動率很高,我一個一個去發文似乎不是好辦法,問題二是我也不清楚到底有多少個妹子對追蹤我有興趣。還有一個問題是,妹子們如何知道我的臉書貼文更新,即使我忘了通知她「嘿,我更新貼文了,幫我按讚吧!」

有一個做法是把妹子們註冊到一個清單裡面,一旦我有新的貼文,我就使用一個迴圈一一通知過所有的人,把文章推送給她們。

在臉書上的做法是:請妹子們到我個人的臉書頁面按下搶先看,只要我發篇文章他們都會再通知裡面收到我的新貼文。

臉書推出的搶先看

這樣的做法在設計模式裡面有提到,就叫做 Observer Pattern。

實作步驟

  1. 定義 Subject 與 Observer 介面。

2. 決定誰是 Subject,並實作 Subject 的介面。Observer 也是。

3. 把 Observer attach 到 Subject 中,開始進行訊息推播。這邊因為不能隨便公開姓名,所以用幾個代稱示意一下。

這邊因為我在建構一個 Observer 時就 attach 到 Subject 上了,所以就沒有 main 裡面使用 attach 了,如果新增的 Observer 不見得一定會在初始化時就進行註冊,就不建議採用我的寫法。

4. 當 Subject 狀態改變時, 更新所有 Observer 的狀態。

由圖可以知道,一旦 Subject 被更新之後,裡面的 notifyAllSubscribers 函式被觸發,就會幫訂閱文章的人們進行更新。

UML 表示方式

Source: https://en.wikipedia.org/wiki/Observer_pattern
Source: https://dzone.com/articles/design-patterns-uncovered

使用時機

說了那麼多,那什麼時候我在設計程式時會用到這種設計模式?

問題:如何讓不同的客戶端得知被觀察的物件狀態改變,並且統一進行更新?

衍生的其他問題:

  • 物件狀態異動的頻率無法預料。如同前面說的女生來來去去的。
  • 為了達到狀態一致性而將物件緊密耦合在一起,將會降低物件的重複使用性。
  • 無法明確知道資料相依物件的個數,可能有任意數量的物件都有興趣想要知道被觀察物件的狀態。就有點像是你不能預期有多少女生訂閱文章。
  • 當某物件狀態改變時,其相依物件必須適時自動被通知。

如果有以上的狀況,可以試著使用觀察者模式降低設計的複雜度!

結論

這樣實作的優點是, Subject 更新時不須指定接收的 Observer ,更新會自動通知所有進行註冊的 Observer。

這個案例有個缺點是如果你的 Observer 如果嫌煩的話,可能會取消追蹤你。或者是邊緣人不用用到這樣的模式...。

參考

  1. Head First Design Pattern 深入淺出設計模式
  2. 搞笑談軟工 - 重新整理Observer Pattern
  3. 阿洲的程式教學 - 觀察者模式(Observer Pattern)
  4. TutorialsPoint — Design Patterns — Observer Pattern
  5. DZone — Observer Pattern Tutorial with Java Examples