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

更新於 2024/05/31閱讀時間約 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)根據自身的需求在適當的時機註冊訂閱來獲得消息通知,不需要時也可以隨時取消訂閱,除了註冊與取消註冊外,兩者之間沒有相其他依賴,不管是維護或擴展都非常靈活。

avatar-img
66會員
19內容數
探索自我實現的小角落。沒有高高在上的教條,只有真實的分享和心得。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
再寫5分鐘 的其他內容
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
MVC是一種物件導向設計模式,將應用程式分成Model、View和Controller。是在1979年被提出,主要是要解決下列問題: 維護「長存儲存媒體」(Persistent Storage)的資料 維護執行流程的邏輯控制 顯示使用者所需的資訊和使用介面 Model 實作儲存應用程式
Thumbnail
所有的 CSS 設計模式都是為了維持可讀性、好維護、易擴充這幾個目標,今天就來談談 BEM 設計模式,並搭配 Sass 中的 SCSS 來介紹,並探討在各種情境下該如何使用 BEM。
Thumbnail
前言 如果你閱讀完本系列的第一篇文章,必定會對於Apple Vision Pro的產品更感興趣。本篇文章中,我們將介紹在空間性設計中,是怎麼樣進行互動的。 Design for spatial input 空間性設計的操作,除了用手以外,來多了眼睛作為操作工具。另外聲音(語音)也會是一個操作媒介。當
Thumbnail
MongoDB非常擅長查詢大量的數據並經常更新這些資訊, 在多數的情況之下, 我們只要查詢資訊最新的狀態, 那假設我們需要查詢資料的上一個狀態呢? 如果我們需要一些文檔版本控管功能時怎麼辦呢? 這就是我們可以使用版本控管設計模式的地方了。 這個模式之下會保存文檔的歷史版本, 我們就不用導入另外一個版
Thumbnail
fast endpoints 是一個支援 .NET 6 以上(Nuget 版本清單) 的 API 輕量框架,雖以簡單與高性能為主打,但也提供了很多常用的功能實現,如 Swagger 整合、Jwt 認證、Api 版本控制、APi 速率限制、Api 回應快取…很適合以此為基礎打造 Api 服務。
Thumbnail
小心設計模式別亂用 📷 介紹 設計模式就是過去的人,根據常見的軟體設計的問題,提出的解決方案。 設計模式總共有23種,根據情境分成三大類型,建立型、結構型、行為型。 建立型模式(Creational Patterns) 簡單工廠(Simple Factory) 工廠方法(Factory) 抽象工廠
Thumbnail
本月的閱讀清單裡,除了上一本西野亮廣的<不改變就無法生存>外,還有另一本性質有一點類似,但是是從實務角度出發的書,那就是理想生活設計的佐伊。 疫情使然,使許多人是「被迫」開始想辦法把工作全部數位化的。 但,一件事總是一體兩面,在家工作必然的困難點不外乎幾個: 在家裡同時有許多會干擾工作效率的因素:
Thumbnail
K大怎麼建立自己的飛輪,並且持續利用綜效,創造出巨大效益呢?
Thumbnail
許多人想要開始經營自己的斜槓事業,雖然腦中大致有個初步的方向,或是大約了解自己的興趣和方向,但仍不確定如何開始設計自己的個人品牌商業模式。 而有了商業模式的設計之後,在撰寫部落格文章也將各有系統和方向,也更容易駕馭相對應的行動呼籲喔! 這篇文章你可以學習到如何設計你的個人品牌商業模式-->
Thumbnail
我是部落客,也要設計產品服務區嗎? 是的!Winnie建議你在自己的部落格網站上放上自己設計的產品服務區! 有一些人可能會認為自己只是純粹寫部落格分享自己的想法,並尚未準備提供產品或服務,或是認為自己的人氣還不夠,即使推出產品或服務也不會有人購買,所以就不先設計「產品服務區」了,但我還是非常推薦..
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
MVC是一種物件導向設計模式,將應用程式分成Model、View和Controller。是在1979年被提出,主要是要解決下列問題: 維護「長存儲存媒體」(Persistent Storage)的資料 維護執行流程的邏輯控制 顯示使用者所需的資訊和使用介面 Model 實作儲存應用程式
Thumbnail
所有的 CSS 設計模式都是為了維持可讀性、好維護、易擴充這幾個目標,今天就來談談 BEM 設計模式,並搭配 Sass 中的 SCSS 來介紹,並探討在各種情境下該如何使用 BEM。
Thumbnail
前言 如果你閱讀完本系列的第一篇文章,必定會對於Apple Vision Pro的產品更感興趣。本篇文章中,我們將介紹在空間性設計中,是怎麼樣進行互動的。 Design for spatial input 空間性設計的操作,除了用手以外,來多了眼睛作為操作工具。另外聲音(語音)也會是一個操作媒介。當
Thumbnail
MongoDB非常擅長查詢大量的數據並經常更新這些資訊, 在多數的情況之下, 我們只要查詢資訊最新的狀態, 那假設我們需要查詢資料的上一個狀態呢? 如果我們需要一些文檔版本控管功能時怎麼辦呢? 這就是我們可以使用版本控管設計模式的地方了。 這個模式之下會保存文檔的歷史版本, 我們就不用導入另外一個版
Thumbnail
fast endpoints 是一個支援 .NET 6 以上(Nuget 版本清單) 的 API 輕量框架,雖以簡單與高性能為主打,但也提供了很多常用的功能實現,如 Swagger 整合、Jwt 認證、Api 版本控制、APi 速率限制、Api 回應快取…很適合以此為基礎打造 Api 服務。
Thumbnail
小心設計模式別亂用 📷 介紹 設計模式就是過去的人,根據常見的軟體設計的問題,提出的解決方案。 設計模式總共有23種,根據情境分成三大類型,建立型、結構型、行為型。 建立型模式(Creational Patterns) 簡單工廠(Simple Factory) 工廠方法(Factory) 抽象工廠
Thumbnail
本月的閱讀清單裡,除了上一本西野亮廣的<不改變就無法生存>外,還有另一本性質有一點類似,但是是從實務角度出發的書,那就是理想生活設計的佐伊。 疫情使然,使許多人是「被迫」開始想辦法把工作全部數位化的。 但,一件事總是一體兩面,在家工作必然的困難點不外乎幾個: 在家裡同時有許多會干擾工作效率的因素:
Thumbnail
K大怎麼建立自己的飛輪,並且持續利用綜效,創造出巨大效益呢?
Thumbnail
許多人想要開始經營自己的斜槓事業,雖然腦中大致有個初步的方向,或是大約了解自己的興趣和方向,但仍不確定如何開始設計自己的個人品牌商業模式。 而有了商業模式的設計之後,在撰寫部落格文章也將各有系統和方向,也更容易駕馭相對應的行動呼籲喔! 這篇文章你可以學習到如何設計你的個人品牌商業模式-->
Thumbnail
我是部落客,也要設計產品服務區嗎? 是的!Winnie建議你在自己的部落格網站上放上自己設計的產品服務區! 有一些人可能會認為自己只是純粹寫部落格分享自己的想法,並尚未準備提供產品或服務,或是認為自己的人氣還不夠,即使推出產品或服務也不會有人購買,所以就不先設計「產品服務區」了,但我還是非常推薦..