python实现观察者模式
目录
一、观察者模式解决了哪些问题:
- 对象之间的一对多依赖关系应该在不使对象紧密耦合的情况下定义。
- 应该确保当一个对象改变状态时,自动更新无限数量的依赖对象。
- 一个对象可以通知无限数量的其他对象应该是可能的。
二、体检的小栗子
举一个生活中常见的小栗子。你想要了解自己的身体状况。
方案一:
想要了解自己眼睛,健康状况,去A医院,挂一个眼科进行检查
想要了解自己血糖,健康状况,去B医院,挂一个内科进行检查
想要了解自己肝功能状态,,去C医院,挂一个号进行检查。
方案二:做一个体检项目
做一个体检项目,项目里包含身高、体重、视力、血糖、肝功能等一系列检查。
如果我还想检查更多的项目,可能在体检套餐里加入特定的体检项目。
观察者模式:
体检(类)-检查(方法)
写一个体检接口,里面有检查方法。然后多个实现类:
体重类,需要实现体检接口的检查方法
身高类,需要实现体检接口的检查方法。
目的就是把所有的类,在类型上统一,都归属于体检类,这样就可以组成一个体检集合,然后遍历每个元素的检查方法
--------------------------------------------------------------------------------------------------------------------------
三、什么是观察者模式
主要解决:当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
关键代码:在抽象类里有一个list存放观察者们。
四、代码实现
感觉观察者的核心就是:
定义一个观察者接口,具体执行逻辑的类来实现它。就是为了能够将这几个实现类,组合成一个集合。然后调用遍历每个元素的方法。
在这个例子里,观察者的核心就是:
将各个检查项目,组装成了一个体检单。(体检单里可以增加或者剔除某个体检项目)
# 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)
原文地址:https://blog.csdn.net/qq_39208536/article/details/140609047
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!