觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。

關鍵影響
- 封裝細節:主題僅管理觀察者的註冊和通知,而不需要知道觀察者的具體實現細節。
- 靈活的訂閱與取消訂閱:觀察者可以隨時決定是否訂閱或取消訂閱主題的訊息通知,極大增加了系統的靈活性。
- 訊息通知:主題通過一個統一的介面向所有註冊的觀察者發送通知訊息,這使得維護變得簡單且高效。
- 系統解耦:觀察者和主題之間的低耦合設計使得修改和擴展系統更加容易,且互不影響。
應用場景
假設我們正在開發新聞系統,在新聞出現時即時通知所有記者。
功能描述
- NewsPublisher:新聞發布者(主題),維護一個記者列表,並在有新聞時通知他們。
- Reporter:記者(觀察者),註冊自己以接收新聞更新,並在有新聞時獲得通知。
動作流程
- 註冊訂閱者:
Alice
和Bob
註冊到新聞發布者。 - 發布新聞:當
NewsPublisher
有新聞時會調用notify
方法將新聞推送給所有註冊的記者。 - 接收通知:每個記者在接收到新聞更新時,將顯示他們已經收到的新聞。
class NewsPublisher:
def __init__(self):
self._subscribers = []
def register(self, subscriber):
self._subscribers.append(subscriber)
def unregister(self, subscriber):
self._subscribers.remove(subscriber)
def publish(self, news):
for subscriber in self._subscribers:
subscriber.notify(news)
class Reporter:
def __init__(self, name):
self._name = name
def update(self, news):
print(f"{self._name} received news: {news}")
# 使用範例
news_publisher = NewsPublisher()
repoter1 = Reporter("Alice")
repoter2 = Reporter("Bob")
# 新聞發佈者註冊待通知記者
news_publisher.register(repoter1)
news_publisher.register(repoter2)
# 新聞發佈者發布新聞
news = "Wolves wiped Nuggets!"
news_publisher.publish(news)
結論
透過觀察者模式,發布者(publisher)可以專注在訊息的生產,而訂閱者(subscriber)根據自身的需求在適當的時機註冊訂閱來獲得消息通知,不需要時也可以隨時取消訂閱,除了註冊與取消註冊外,兩者之間沒有相其他依賴,不管是維護或擴展都非常靈活。