
用珠宝场景类比: 主题(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.py
from abc import ABC, abstractmethod
# ------------------------------
# 第一步:定义抽象类(规范接口)
# ------------------------------
class Observer(ABC):
"""
观察者抽象类(所有关注珠宝店的人都要实现这个接口)
"""
@abstractmethod
def 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.py
from abc import ABC, abstractmethod
# ------------------------------
# 第一步:定义抽象类(规范接口)
# ------------------------------
class Subject(ABC):
"""
主题抽象类(珠宝店的核心行为规范)
"""
@abstractmethod
def attach(self, observer):
"""
添加观察者(关注珠宝店)
:param observer:
:return:
"""
pass
@abstractmethod
def detach(self, observer):
"""
移除观察者(取消关注)
:param observer:
:return:
"""
pass
@abstractmethod
def 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.py
from 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 = name
def 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.py
from ObserverPattern.Observer import Observer
# ------------------------------
# 第三步:实现具体的观察者(不同类型的关注者)
# ------------------------------
class JewelryCollector(Observer):
"""
观察者2:珠宝收藏家
"""
def __init__(self, name):
"""
:param name:
"""
self.name = name
def 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 = name
def 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.py
from 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 ObserveBll
if __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.')