觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
假設我們正在開發新聞系統,在新聞出現時即時通知所有記者。
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)根據自身的需求在適當的時機註冊訂閱來獲得消息通知,不需要時也可以隨時取消訂閱,除了註冊與取消註冊外,兩者之間沒有相其他依賴,不管是維護或擴展都非常靈活。