在 Python 中實現觀察者模式的具體步驟是什么?

在 Python 中實現觀察者模式可以遵循以下具體步驟,這些步驟清晰地劃分了角色和交互流程:

步驟 1:定義主題(Subject)基類

主題是被觀察的對象,負責管理觀察者和發送通知。需實現以下核心方法:

  • 存儲觀察者的容器(如列表)
  • 添加觀察者的方法(attach
  • 移除觀察者的方法(detach
  • 通知所有觀察者的方法(notify
class Subject:def __init__(self):self._observers = []  # 保存所有注冊的觀察者def attach(self, observer):"""添加觀察者到列表"""if observer not in self._observers:self._observers.append(observer)def detach(self, observer):"""從列表中移除觀察者"""try:self._observers.remove(observer)except ValueError:pass  # 忽略未找到的觀察者def notify(self, *args, **kwargs):"""通知所有觀察者狀態變化"""for observer in self._observers:observer.update(*args, **kwargs)  # 調用觀察者的更新方法

步驟 2:實現具體主題(ConcreteSubject)

具體主題是實際業務對象,維護自身狀態,當狀態變化時觸發通知。

class WeatherStation(Subject):  # 繼承主題基類def __init__(self):super().__init__()self._temperature = None  # 示例:溫度狀態@propertydef temperature(self):return self._temperature@temperature.setterdef temperature(self, new_temp):self._temperature = new_temp  # 更新狀態self.notify(new_temp)  # 狀態變化時通知觀察者

步驟 3:定義觀察者(Observer)基類/接口

觀察者是接收通知的對象,需定義一個更新方法(update),供主題調用。

class Observer:def update(self, *args, **kwargs):"""接收主題通知的方法,子類必須實現"""raise NotImplementedError("子類必須重寫 update 方法")

步驟 4:實現具體觀察者(ConcreteObserver)

具體觀察者根據自身需求實現update方法,處理主題發送的通知。

class PhoneDisplay(Observer):  # 手機顯示屏觀察者def update(self, temp):print(f"手機顯示:當前溫度 {temp}°C")class WindowDisplay(Observer):  # 窗口顯示屏觀察者def update(self, temp):print(f"窗口顯示:溫度更新為 {temp}°C")

步驟 5:使用觀察者模式

創建主題和觀察者實例,關聯它們,并觸發狀態變化驗證效果。

# 1. 創建主題(被觀察者)
weather_station = WeatherStation()# 2. 創建觀察者
phone_display = PhoneDisplay()
window_display = WindowDisplay()# 3. 注冊觀察者到主題
weather_station.attach(phone_display)
weather_station.attach(window_display)# 4. 改變主題狀態(自動通知觀察者)
print("--- 溫度變為 25°C ---")
weather_station.temperature = 25print("\n--- 溫度變為 30°C ---")
weather_station.temperature = 30# 5. 移除一個觀察者
weather_station.detach(phone_display)
print("\n--- 移除手機顯示后,溫度變為 28°C ---")
weather_station.temperature = 28

執行結果

--- 溫度變為 25°C ---
手機顯示:當前溫度 25°C
窗口顯示:溫度更新為 25°C--- 溫度變為 30°C ---
手機顯示:當前溫度 30°C
窗口顯示:溫度更新為 30°C--- 移除手機顯示后,溫度變為 28°C ---
窗口顯示:溫度更新為 28°C

核心邏輯總結

  1. 主題與觀察者解耦:主題只需知道觀察者有update方法,無需了解其具體實現;觀察者也無需知道主題的內部邏輯。
  2. 動態關聯:通過attachdetach可以隨時添加/移除觀察者,靈活性高。
  3. 自動通知:主題狀態變化時,主動調用所有注冊觀察者的update方法,實現"一處變化,多處響應"。

這種模式適用于事件監聽、狀態同步、發布-訂閱系統等場景,例如 GUI 中的按鈕點擊事件、數據更新通知等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921804.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921804.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921804.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分布式方案 一 分布式鎖的四大實現方式

Java分布式鎖實現方式詳解 什么是分布式鎖 基于數據庫的分布式鎖基于Redis的分布式鎖基于ZooKeeper的分布式鎖基于Etcd的分布式鎖 各種實現方式對比最佳實踐建議多節點/線程調用結果展示 基于數據庫的分布式鎖 - 多線程測試基于Redis的分布式鎖 - 多節點測試基于ZooKeeper的分…

基于Room+RESTful的雙權限Android開機時間監控方案

概述 以下是使用Kotlin實現的商業級Android開機時間記錄功能,包含現代Android開發最佳實踐。 系統架構 組件設計 // BootReceiver - 接收開機廣播 class BootReceiver : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent?) {if (int…

水庫大壩安全監測系統的作用

水庫大壩作為重要的水利基礎設施,承擔著防洪、供水、發電、灌溉等多重功能,其安全性直接關系到人民生命財產安全和社會經濟發展。然而,由于自然環境變化、材料老化、荷載作用以及人為因素的影響,大壩在長期運行過程中可能出現裂縫…

《Kubernetes 構建 MySQL MGR 集群實戰教程》

#### 一、前言 MySQL Group Replication (MGR) 是 MySQL 官方提供的高可用集群方案,基于 Paxos 協議實現多節點數據強一致性。本教程將指導如何在 Kubernetes 上部署 MySQL MGR 集群,適用于生產級高可用場景。---#### 二、環境準備 1. **Kubernetes 集…

影視APP源碼 SK影視 安卓+蘋果雙端APP 反編譯詳細視頻教程+源碼

內容目錄一、詳細介紹二、效果展示1.部分代碼2.效果圖展示三、學習資料下載一、詳細介紹 影視APP源碼 SK影視 安卓蘋果雙端APP 反編譯詳細視頻教程源碼 自帶對接優效SDK廣告(已失效)。域名和IP都可以搭建。 自帶一起看和短劇頁面功能,三種…

pyqt+python之二進制生肖占卜

目錄 一、引言 二、GUI界面設計 1.效果演示 2.相關提示 3.界面設計.py 三、主要程序詳解 1.導入相關模塊 2.初始化設置 3.組內判斷 4.猜測過程 四、總程序代碼 一、引言 在數字時代,傳統文化與編程語言的碰撞總能迸發奇妙火花。本項目以PyQtPython為技術…

人工智能-python-深度學習-經典網絡模型-LeNets5

文章目錄LeNet-5(詳解)—— 從原理到 PyTorch 實現(含訓練示例)簡介LeNet-5 的核心思想LeNet-5 逐層結構詳解逐層計算舉例📌 輸入層📌 C1 卷積層📌 S2 池化層📌 C3 卷積層&#x1f4…

機器視覺的手機柔性屏貼合應用

在智能手機制造領域,柔性屏逐漸成為智能手機的主流選擇,柔性屏因其輕便、易于彎曲的特性,已成為現代電子設備的重要組成部分,但同時也帶來了前所未有的制造挑戰。柔性屏與傳統剛性玻璃屏有本質區別,它容易形變&#xf…

貪心算法應用:數字孿生同步問題詳解

Java中的貪心算法應用:數字孿生同步問題詳解 貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是全局最好或最優的算法。下面我將全面詳細地講解貪心算法在數字孿生同步問題中的應用。…

UOS20系統安裝與 SSH/XRDP 遠程訪問功能配置指南

UOS20系統安裝與 SSH/XRDP 遠程訪問功能配置指南 一、UOS 20 系統安裝? ?1. 下載系統鏡像? 訪問統信官網下載 UOS 20 專業版鏡像(推薦適配當前硬件的版本): https://www.chinauos.com/resource/download-professional 2. 系統安裝與硬件配…

【Python】S1 基礎篇 P5 字典模塊指南

目錄字典的本質與底層實現基礎語法結構使用字典訪問字典中的值添加鍵值對修改字典中的值刪除鍵值對使用 get() 來訪問值遍歷字典遍歷所有鍵值對遍歷字典中的所有鍵遍歷字典中的所有值嵌套字典列表在字典中存儲列表字典(Dictionary)是Python中靈活且強大的…

計算機視覺之多模板匹配

簡介 計算機視覺第一課opencv(四)保姆級教學 之前說過模糊匹配只是對于單個目標進行匹配,今天我們就來學習一下如何對多個目標進行匹配 一、多目標匹配 對于這個圖片我們要匹配下面那個箭頭,我們可以發現圖中是有兩個位置相同的…

封裝日期選擇器組件,帶有上周,下周按鈕

ui圖組件代碼如下&#xff1a; <template><div><el-date-pickerv-model"dateRange"type"daterange"align"right"size"mini":editable"false"unlink-panelsrange-separator"至"start-placeholder&q…

基于SpringBoot+MYSQL開發的AI智能大數據醫療診斷平臺

角色&#xff1a; 管理員、醫生、居民 技術&#xff1a; SpringBoot、MyBatis、MySQL、Shiro、Beetl、Swagger、jQuery、Bootstrap 核心功能&#xff1a; 這是一個基于SpringBoot的社區醫療管理平臺&#xff0c;旨在為管理員提供用戶、角色、部門、菜單、日志等系統管理功能&am…

【MFC 小白日記】對話框編輯器里“原型圖像”到底要不要勾?3 分鐘看懂!

摘要&#xff1a;本文解析了MFC中Picture Control的"原型圖像(Prototype Image)"屬性的真實作用。該屬性僅在設計時提供可視化的占位圖預覽&#xff0c;方便UI布局&#xff0c;運行時不會影響程序表現。文章通過對比實驗驗證&#xff0c;勾選后會在對話框編輯器中顯示…

微信開放平臺第三方平臺,可以管理多個微信小程序

大家好&#xff0c;我是小悟。 這個系統可以幫助服務商更好地管理多個商家小程序&#xff0c;無需管理多個商家小程序的賬號密碼或者appId和secret&#xff0c;大大提升效率。 不需要頻繁登錄小程序后臺就能完成上傳代碼、認證、備案、提交代碼審核、發布小程序等操作。 這里錄…

Java全棧學習筆記32

-- drop table t_stu;-- unique 唯一約束的列允許為null-- 如果在之后的操作中。需要某列必須為key&#xff0c;才能做一些操作的情況下。也可以使用唯一約束代替主鍵約束-- create table t_stu(-- studId int,-- tel varchar(11) unique,-- sex varchar(1),-- addr va…

linux升級系統,重啟出現Minimal BASH-like line editingis supported

文章目錄一.問題背景二.解決步驟2.1確認系統分區2.2手動引導2.3 重建grub引導2.4 還原軟件包 一.問題背景 閑來無事&#xff0c;把ubuntu25.04通過sudo do-release-upgrade命令升級到了ubuntu25.10.在升級的過程會出現以下問題 1.自動替換flatpak程序為snap2.請求是否清除舊依賴…

type(類型別名)和 interface的區別和最佳實踐

核心結論在大多數情況下&#xff0c;它們可以互換使用&#xff0c;都能描述對象的結構。它們的區別更多在于設計和擴展能力上。主要區別總結表特性interface (接口)type (類型別名)擴展方式使用 extends 繼承interface A extends B {}使用 & 交叉類型type A B & C合并…

vscode中使用git、githup的基操

一、git提交 配置賬戶密碼 查看用戶信息 git config --global user.name # 查看用戶名 git config --global user.email # 查看郵箱賬戶配置 # 設置全局用戶名和郵箱 git config --global user.name "你的用戶名" git config --global user.email "你的郵箱&q…