首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >python: Observer Pattern

python: Observer Pattern

作者头像
geovindu
发布2026-06-18 12:40:27
发布2026-06-18 12:40:27
690
举报

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

代码语言:javascript
复制
# 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
代码语言:javascript
复制
# 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()
代码语言:javascript
复制
# 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} → 联系进货!")
代码语言:javascript
复制
# 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("皇家红宝石戒指")

调用:

代码语言:javascript
复制
# 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.')
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档