軟體設計模式 | 觀察者模式

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

關鍵影響

  • 封裝細節:主題僅管理觀察者的註冊和通知,而不需要知道觀察者的具體實現細節。
  • 靈活的訂閱與取消訂閱:觀察者可以隨時決定是否訂閱或取消訂閱主題的訊息通知,極大增加了系統的靈活性。
  • 訊息通知:主題通過一個統一的介面向所有註冊的觀察者發送通知訊息,這使得維護變得簡單且高效。
  • 系統解耦:觀察者和主題之間的低耦合設計使得修改和擴展系統更加容易,且互不影響。

應用場景

假設我們正在開發新聞系統,在新聞出現時即時通知所有記者。

功能描述

  • NewsPublisher:新聞發布者(主題),維護一個記者列表,並在有新聞時通知他們。
  • Reporter:記者(觀察者),註冊自己以接收新聞更新,並在有新聞時獲得通知。

動作流程

  1. 註冊訂閱者AliceBob 註冊到新聞發布者。
  2. 發布新聞:當 NewsPublisher 有新聞時會調用 notify 方法將新聞推送給所有註冊的記者。
  3. 接收通知:每個記者在接收到新聞更新時,將顯示他們已經收到的新聞。
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)根據自身的需求在適當的時機註冊訂閱來獲得消息通知,不需要時也可以隨時取消訂閱,除了註冊與取消註冊外,兩者之間沒有相其他依賴,不管是維護或擴展都非常靈活。

24會員
14內容數
區塊鏈著名的三角悖論 : 去中心化、可擴展性、安全性三者無法兼得。 這種顧此失彼的困境像極了人生。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
[設計模式]MVCMVC是一種物件導向設計模式,將應用程式分成Model、View和Controller。是在1979年被提出,主要是要解決下列問題: 維護「長存儲存媒體」(Persistent Storage)的資料 維護執行流程的邏輯控制 顯示使用者所需的資訊和使用介面 Model 實作儲存應用程式
avatar
小黑
2023-12-05
BEM 設計模式與各種使用情境所有的 CSS 設計模式都是為了維持可讀性、好維護、易擴充這幾個目標,今天就來談談 BEM 設計模式,並搭配 Sass 中的 SCSS 來介紹,並探討在各種情境下該如何使用 BEM。
Thumbnail
avatar
傑米
2023-07-14
Apple Vision Pro設計解析(第二集)-操作模式前言 如果你閱讀完本系列的第一篇文章,必定會對於Apple Vision Pro的產品更感興趣。本篇文章中,我們將介紹在空間性設計中,是怎麼樣進行互動的。 Design for spatial input 空間性設計的操作,除了用手以外,來多了眼睛作為操作工具。另外聲音(語音)也會是一個操作媒介。當
Thumbnail
avatar
ABLE
2023-06-11
【💎 資料庫寶典】MongoDB版本控管設計模式MongoDB非常擅長查詢大量的數據並經常更新這些資訊, 在多數的情況之下, 我們只要查詢資訊最新的狀態, 那假設我們需要查詢資料的上一個狀態呢? 如果我們需要一些文檔版本控管功能時怎麼辦呢? 這就是我們可以使用版本控管設計模式的地方了。 這個模式之下會保存文檔的歷史版本, 我們就不用導入另外一個版
Thumbnail
avatar
阿Han
2023-04-23
Fast Endpoints 一個基於 REPR 設計模式的 .NET 輕量高性能 API 框架fast endpoints 是一個支援 .NET 6 以上(Nuget 版本清單) 的 API 輕量框架,雖以簡單與高性能為主打,但也提供了很多常用的功能實現,如 Swagger 整合、Jwt 認證、Api 版本控制、APi 速率限制、Api 回應快取…很適合以此為基礎打造 Api 服務。
Thumbnail
avatar
Sponge | 一塊海綿
2023-02-09
玩轉C#之【設計模式-Design Pattern】小心設計模式別亂用 📷 介紹 設計模式就是過去的人,根據常見的軟體設計的問題,提出的解決方案。 設計模式總共有23種,根據情境分成三大類型,建立型、結構型、行為型。 建立型模式(Creational Patterns) 簡單工廠(Simple Factory) 工廠方法(Factory) 抽象工廠
Thumbnail
avatar
一代軍師
2022-10-10
【網路時代的遠距工作模式】設計你的理想生活x佐伊zoey|好書分享#02本月的閱讀清單裡,除了上一本西野亮廣的<不改變就無法生存>外,還有另一本性質有一點類似,但是是從實務角度出發的書,那就是理想生活設計的佐伊。 疫情使然,使許多人是「被迫」開始想辦法把工作全部數位化的。 但,一件事總是一體兩面,在家工作必然的困難點不外乎幾個: 在家裡同時有許多會干擾工作效率的因素:
Thumbnail
avatar
楊筠 Yuna
2022-01-03
課程心得|K大-個人商業模式設計K大怎麼建立自己的飛輪,並且持續利用綜效,創造出巨大效益呢?
Thumbnail
avatar
椪皮仔
2021-01-13
如何設計符合你的靈魂之個人品牌商業模式?試試Winnie的3大產品設計方法!許多人想要開始經營自己的斜槓事業,雖然腦中大致有個初步的方向,或是大約了解自己的興趣和方向,但仍不確定如何開始設計自己的個人品牌商業模式。 而有了商業模式的設計之後,在撰寫部落格文章也將各有系統和方向,也更容易駕馭相對應的行動呼籲喔! 這篇文章你可以學習到如何設計你的個人品牌商業模式-->
Thumbnail
avatar
Wix網頁玩家 布蘭達&維尼
2019-11-29
我只是部落客,也要設計變現模式嗎?寫文章前先設計產品服務的3大原因!我是部落客,也要設計產品服務區嗎? 是的!Winnie建議你在自己的部落格網站上放上自己設計的產品服務區! 有一些人可能會認為自己只是純粹寫部落格分享自己的想法,並尚未準備提供產品或服務,或是認為自己的人氣還不夠,即使推出產品或服務也不會有人購買,所以就不先設計「產品服務區」了,但我還是非常推薦..
Thumbnail
avatar
Wix網頁玩家 布蘭達&維尼
2019-09-08