python实现观察者模式

目录

一、观察者模式解决了哪些问题:

二、体检的小栗子

三、什么是观察者模式

四、代码实现


**一、**观察者模式解决了哪些问题:

  • 对象之间的一对多依赖关系应该在不使对象紧密耦合的情况下定义。
  • 应该确保当一个对象改变状态时,自动更新无限数量的依赖对象。
  • 一个对象可以通知无限数量的其他对象应该是可能的。

二、体检的小栗子

举一个生活中常见的小栗子。你想要了解自己的身体状况。

方案一:

想要了解自己眼睛,健康状况,去A医院,挂一个眼科进行检查

想要了解自己血糖,健康状况,去B医院,挂一个内科进行检查

想要了解自己肝功能状态,,去C医院,挂一个号进行检查。

方案二:做一个体检项目

做一个体检项目,项目里包含身高、体重、视力、血糖、肝功能等一系列检查。

如果我还想检查更多的项目,可能在体检套餐里加入特定的体检项目。

观察者模式:

体检(类)-检查(方法)

写一个体检接口 ,里面有检查方法。然后多个实现类:

体重类,需要实现体检接口的检查方法

身高类,需要实现体检接口的检查方法。

目的就是把所有的类,在类型上统一,都归属于体检类,这样就可以组成一个体检集合 ,然后遍历每个元素的检查方法


三、什么是观察者模式

**主要解决:**当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

**关键代码:**在抽象类里有一个list存放观察者们。

四、代码实现

感觉观察者的核心就是:

定义一个观察者接口,具体执行逻辑的类来实现它。就是为了能够将这几个实现类,组合成一个集合。然后调用遍历每个元素的方法。

在这个例子里,观察者的核心就是:

将各个检查项目,组装成了一个体检单。(体检单里可以增加或者剔除某个体检项目)

4.1 实现方式一

1、观察者模版

提供 注册 观察者功能

python 复制代码
# -*- coding:utf-8 -*-
# @Author: 喵酱
# @time: 2024 - 07 -25
# @File: HealthCheckObserver.py
# desc: 观察者主题
from common.singleton import singleton


@singleton
class HealthCheckObserver:
    def __init__(self):
        self._observers = []  # 初始化观察者列表

    def register(self, observer):
        self._observers.append(observer)  # 注册观察者

    def unregister(self, observer):
        self._observers.remove(observer)  # 取消注册观察者

    def notify(self,data):
        for observer in self._observers:
            observer.update(data) # 通知所有观察者(header观察者、body观察者)更新

2、实现观察者

python 复制代码
# -*- coding:utf-8 -*-
# @Author: 喵酱
# @time: 2024 - 07 -16
# @File: HeadObserver.py
# desc:

class HeadObserver(HealthCheckObserver):

    def update(self, data):
        pass
     

3、 调用观察者

3.1 创建ObserverManager 统一管理 观察者

python 复制代码
class ObserverManager:
    _instance = None

    @staticmethod
    def get_instance():
        if ObserverManager._instance is None:
            ObserverManager()
        return ObserverManager._instance

    def __init__(self):
        if ObserverManager._instance is not None:
            raise Exception("This class is a singleton!")
        else:
            ObserverManager._instance = self
        self._health_check_observer = HealthCheckObserver()
        self._head_observer = HeadObserver()
        self._eye_observer = EyeObserver()
 

        # 注册观察者到认证信息观察者对象中
        self._authentication_observer.register(self._head_observer)
        self._authentication_observer.register(self._eye_observer )
 

    def notify_observers(self, data):
        self._authentication_observer.notify(data)

调用

python 复制代码
# 创建观察者管理器(单例模式)
manager = ObserverManager.get_instance()
# 通知所有注册的观察者
manager.notify_observers(data)

4.2 实现方式二

python 复制代码
# Python实现观察者模式的体检项目通知系统

from abc import ABC, abstractmethod

# 体检对象类
class Person:
    def __init__(self, name):
        self.name = name
        self.height = 0
        self.weight = 0
        self.vision = ""  # 视力
        self.lung = ""  # 肺部
        self.blood = ""  # 血液

    def __str__(self):
        return f"Person {self.name}: height={self.height}, weight={self.weight}, vision={self.vision}, lung={self.lung}, blood={self.blood}"


# 体检接口
class HealthCheckupIObserver(ABC):
    @abstractmethod
    def check(self, person: Person):
        pass


# 视力科室
class Eye(HealthCheckupIObserver):
    def check(self, person: Person):
        print(f"Eye department checking vision for {person.name}")


# 内科科室
class InternalMedicine(HealthCheckupIObserver):
    def check(self, person: Person):
        print(f"Internal Medicine department checking lungs for {person.name}")


# 外科科室
class Surgery(HealthCheckupIObserver):
    def check(self, person: Person):
        print(f"Surgery department checking height for {person.name}")


# 体检单管理类
class ObserverManager:
    def __init__(self):
        self.observers = [
            InternalMedicine(),  # 内科检查
            Eye(),  # 眼科检查
            Surgery()  # 外科检查
        ]

    def check(self, person: Person):
        for observer in self.observers:
            observer.check(person)


# 客户端测试代码
if __name__ == "__main__":
    person = Person("小明")
    observer_manager = ObserverManager()
    observer_manager.check(person)
相关推荐
金池尽干8 小时前
设计模式之——观察者模式
观察者模式·设计模式
hxj..1 天前
【设计模式】观察者模式
java·观察者模式·设计模式
潘多编程1 天前
Spring Boot观察者模式实战
spring boot·后端·观察者模式
九鼎科技-Leo1 天前
在 C# 中,如何实现观察者模式?
观察者模式·c#·.net
老攀呀4 天前
观察者模式(Observer Pattern)
观察者模式
倚-天-照-海5 天前
Java设计模式之观察者模式
java·观察者模式·设计模式
郑..方..醒8 天前
设计模式-观察者模式(代码实现、源码级别应用、使用场景)
观察者模式·设计模式
CV猿码人9 天前
设计模式-观察者模式
观察者模式·设计模式
前端拾光者9 天前
前端开发设计模式——观察者模式
观察者模式·设计模式
徒步僧13 天前
Java设计模式—观察者模式详解
java·观察者模式·设计模式