当前位置: 首页 > news >正文

python: Observer Pattern

用珠宝场景类比:
主题(Subject):珠宝店(有新款珠宝到货、打折等状态变化)
观察者(Observer):珠宝爱好者、收藏家、经销商(关注珠宝店的动态)
核心行为:珠宝店有新品到货时,会主动通知所有关注它的人。

# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:观察者模式(Observer Pattern)
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/2/26 21:14 
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : Observer.pyfrom abc import ABC, abstractmethod# ------------------------------
# 第一步:定义抽象类(规范接口)
# ------------------------------class Observer(ABC):"""观察者抽象类(所有关注珠宝店的人都要实现这个接口)"""@abstractmethoddef update(self, message):"""收到通知后的更新方法(必须实现):param message::return:"""pass# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:观察者模式(Observer Pattern)
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/2/26 21:18 
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : Subject.pyfrom abc import ABC, abstractmethod# ------------------------------
# 第一步:定义抽象类(规范接口)
# ------------------------------class Subject(ABC):"""主题抽象类(珠宝店的核心行为规范)"""@abstractmethoddef attach(self, observer):"""添加观察者(关注珠宝店):param observer::return:"""pass@abstractmethoddef detach(self, observer):"""移除观察者(取消关注):param observer::return:"""pass@abstractmethoddef notify(self):"""通知所有观察者(有新动态时):return:"""pass

  

# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:观察者模式(Observer Pattern)
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/2/26 21:17 
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : JewelryStore.pyfrom ObserverPattern.Subject import Subject# ------------------------------
# 第二步:实现具体的主题(珠宝店)
# ------------------------------class JewelryStore(Subject):"""具体的主题:珠宝店"""def __init__(self, name):""":param name:"""self.name = name  # 珠宝店名称self.observers = []  # 存储所有观察者(关注者)self.latest_info = ""  # 最新的珠宝动态(状态)def attach(self, observer):"""添加关注者:param observer::return:"""if observer not in self.observers:self.observers.append(observer)print(f"{observer.name} 关注了 {self.name} 珠宝店")def detach(self, observer):"""取消关注:param observer::return:"""if observer in self.observers:self.observers.remove(observer)print(f"{observer.name} 取消了 {self.name} 珠宝店的关注")def notify(self):"""通知所有关注者最新动态:return:"""print(f"\n{self.name} 开始通知所有关注者:")for observer in self.observers:observer.update(self.latest_info)def release_new_jewelry(self, jewelry_name):"""发布新款珠宝(状态变化的触发点):param jewelry_name::return:"""self.latest_info = f"新款珠宝「{jewelry_name}」正式上架!"print(f"\n=== {self.name} 重要通知 ===")print(self.latest_info)# 状态变化后,主动通知所有观察者self.notify()def discount_activity(self, discount):"""推出打折活动(另一个状态变化):param discount::return:"""self.latest_info = f"全店珠宝限时{discount}折优惠!"print(f"\n=== {self.name} 重要通知 ===")print(self.latest_info)self.notify()

  

# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:观察者模式(Observer Pattern)
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/2/26 21:22 
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : JewelryFan.py
from ObserverPattern.Observer import Observer# ------------------------------
# 第三步:实现具体的观察者(不同类型的关注者)
# ------------------------------class JewelryFan(Observer):"""观察者1:珠宝爱好者"""def __init__(self, name):""":param name:"""self.name = namedef update(self, message):"""收到通知后的反应:param message::return:"""print(f"✨ 珠宝爱好者 {self.name} 收到消息:{message} → 立刻想去店里看看!")# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:观察者模式(Observer Pattern)
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/2/26 21:23 
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : JewelryCollector.pyfrom ObserverPattern.Observer import Observer# ------------------------------
# 第三步:实现具体的观察者(不同类型的关注者)
# ------------------------------class JewelryCollector(Observer):"""观察者2:珠宝收藏家"""def __init__(self, name):""":param name:"""self.name = namedef update(self, message):"""收到通知后的反应:param message::return:"""print(f"💎 珠宝收藏家 {self.name} 收到消息:{message} → 准备高价收购!")# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:观察者模式(Observer Pattern)
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/2/26 21:25 
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : JewelryDealer.py
from ObserverPattern.Observer import Observer# ------------------------------
# 第三步:实现具体的观察者(不同类型的关注者)
# ------------------------------class JewelryDealer(Observer):"""观察者3:珠宝经销商"""def __init__(self, name):""":param name:"""self.name = namedef update(self, message):"""收到通知后的反应:param message::return:"""print(f"💰 珠宝经销商 {self.name} 收到消息:{message} → 联系进货!")

  

# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:观察者模式(Observer Pattern)
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/2/26 21:26 
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : ObserveBll.pyfrom ObserverPattern.JewelryFan import JewelryFan
from ObserverPattern.JewelryStore import JewelryStore
from ObserverPattern.JewelryDealer import JewelryDealer
from ObserverPattern.JewelryCollector import JewelryCollector# ------------------------------
# 第四步:测试代码(模拟场景)
# ------------------------------class ObserveBll(object):""""""def demo(self):""":return:"""# 1. 创建珠宝店(主题)luxury_jewelry_store = JewelryStore("璀璨珠宝城")# 2. 创建不同的观察者(关注者)alice = JewelryFan("爱丽丝")bob = JewelryCollector("鲍勃")charlie = JewelryDealer("查理")# 3. 关注珠宝店luxury_jewelry_store.attach(alice)luxury_jewelry_store.attach(bob)luxury_jewelry_store.attach(charlie)# 4. 珠宝店发布新款珠宝(触发状态更新)luxury_jewelry_store.release_new_jewelry("星空蓝宝石项链")# 5. 珠宝店推出打折活动(再次触发状态更新)luxury_jewelry_store.discount_activity(8)# 6. 鲍勃取消关注luxury_jewelry_store.detach(bob)# 7. 再次发布新品(只有剩余两人收到通知)luxury_jewelry_store.release_new_jewelry("皇家红宝石戒指")

  

调用:

# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  oracle 21c Neo4j
# Datetime  : 2026/2/18 20:58
# User      : geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : main.py
# explain   : 学习
from bll.MementoBll import MementoBll
from bll.CommandBll import CommandBll
from bll.StateBll import StateBll
from bll.TemplateMethodBll import TemplateMethodBll
from bll.VisitorBll import VisitorBll
from bll.StrategyBll import StrategyBll
from bll.ObserveBll import ObserveBllif __name__ == '__main__':#实现备忘录模式(Memento Pattern)#mementobll= MementoBll()#mementobll.demo()#命令模式(Command Pattern)#commandBll= CommandBll()#commandBll.demo()# 状态模式 State Pattern#stateBll =StateBll()#stateBll.demo()# 模板方法模式 Template Method Pattern#templateMethodBll= TemplateMethodBll()#templateMethodBll.demo()# 访问者模式(Visitor Pattern)#visitor = VisitorBll()#visitor.demo()# 策略模式(Strategy Pattern)#strategyBll = StrategyBll()#strategyBll.demo()# 观察者模式(Observer Pattern)observeBll= ObserveBll()observeBll.demo()print('hi,welcome geovindu.')

 

输出:

image

 

  

 

http://www.jsqmd.com/news/415405/

相关文章:

  • LangChain、FastAPI、Python大型语言模型LLM电商多智能体Multi-Agent客服系统|附代码
  • 想要 B 站视频做剪辑素材?高清无码下载是第一步
  • 本本书屋:为程序员量身打造的技术知识架构与资源导航平台
  • 本本书屋:构建程序员专属的智能化知识工程平台
  • 使用react-pdf 实现pdf预览功能
  • 如何下载 B 站 60 帧高清视频?这一个网址就够了
  • 2026年太原GEO优化公司推荐Top8:从技术实力到效果落地的深度测评 - 小白条111
  • 哲学之星:发刊词——一个开放的思想驿站
  • 2026年哈尔滨GEO优化公司推荐Top6:深度测评与选型指南 - 小白条111
  • 2026年合肥GEO优化公司TOP5深度测评:从技术实力到效果落地的选型指南 - 小白条111
  • 2026年武汉GEO优化公司推荐TOP8:从技术实力到效果落地的深度测评 - 小白条111
  • 集训图论专题
  • 2026年2月灰色花岗岩火烧板供货商推荐,低调耐看工程通用款 - 品牌鉴赏师
  • DOLLAR GENERAL SBT 模式下的 EDI 实施挑战与系统解决方案
  • 绿色化工2026年2月钛酸正/正钛酸四/钛酸四正丁酯正钛酸/钛酸四丁酯厂家三维测评:亲测十大案例,直击行业痛点,这份口碑选型,您值得拥有! - 品牌推荐用户报道者
  • 优秀的设计
  • 2026年GEO源码搭建哪家好? - 源码云科技
  • 适配子血清稳定性:DNA 适配子优势与化学改良策略
  • MAUI库推荐四:Maui.ContentButton
  • 2026年沈阳GEO优化公司推荐Top4:从技术实力到效果落地的专业测评榜单 - 小白条111
  • 解题报告-P11674 [USACO25JAN] Reachable Pairs G
  • P10716 简单的字符串问题 个人题解
  • 2026嘉兴靠谱财税公司推荐|本土深耕11载,汇辉财税凭口碑赢信任 - 品牌智鉴榜
  • 医生/律师如何搭建自己的知识付费平台?开发技术方案解析
  • 实习综合服务计算机毕业设计springboot高校学生平台 基于SpringBoot的高校学生实习管理与就业对接平台 智慧校园环境下的大学生实习实践数字化服务平台
  • 靠谱GEO优化源码搭建工具推荐|源码云GEO优化系统带国家软著,GEO优化排名软件贴牌代理,创业必选项目 - 源码云科技
  • 计算机毕业设计springboot高校学生学业预警系统 基于SpringBoot的高校学生学业风险监测与干预平台 智慧校园环境下的大学生学业状态智能预警管理系统
  • 洛谷 P1629 邮递员送信 (图论入门)
  • 随便写写 - 2
  • 四轮转向4WS轨迹跟踪控制模型 采用双SMC控制 4WS通过积分滑模控制跟踪期望横摆角速度和质...