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

12.python设计模式【观察者模式】

  • 内容:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象得到通知并被自动更新。观者者模式又称为“发布-订阅”模式。比如天气预报,气象局分发气象数据。

  • 角色:

    • 抽象主题(Subject)
    • 具体主题(ConcreteSubject)——发布者
    • 抽象观察者(Observer)
    • 具体观察者(ConcreteOserver)——订阅者
  • 举个例子
    需求:公司可以向每个订阅的员工发送消息,员工可以选择需不需要订阅

from abc import ABCMeta,abstractmethod# 定义顶层代码
# 抽象订阅者
class Observer(metaclass=ABCMeta):@abstractmethoddef update(self,notice):pass
# 抽象发布者
class Notice:def __init__(self):self.observers=[]def attach(self,obs):self.observers.append(obs)def detach(self,obs):self.observers.remove(obs)def notify(self):for obs in self.observers:obs.update(self)class StaffNitice(Notice):def __init__(self,company_info=None):super().__init__()# 处理成私有对象self.__company_info=company_info# 类似于get@propertydef company_info(self):return self.__company_info# 类似于set@company_info.setterdef company_info(self,info):self.__company_info=infoself.notify()# 推送class Staff(Observer):def __init__(self):self.company_info=Nonedef update(self, notice):self.company_info=notice.company_infonotice=StaffNitice("初始公司信息")
s1=Staff()
s2=Staff()
notice.attach(s1)
notice.attach(s2)
notice.company_info="公司今年业绩很好,给大家发奖金"print(s1.company_info)
print(s2.company_info)notice.detach(s1)notice.company_info="公司明天放假"print(s1.company_info)
print(s2.company_info)
  • 适用场景;
    • 当一个抽象模型有两个方面,其中一个依赖于另外一个方面。将这两者封装在独立对对象中以使他们可以各自独立地改变和复用。
    • 当一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
    • 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,你不希望这些对象紧密耦合的。
  • 优点:
    • 目标和观察者之间的抽象耦合最少
    • 支持广播通信
http://www.lryc.cn/news/101380.html

相关文章:

  • 重生之我要学C++第五天
  • 复习之linux高级存储管理
  • HuggingGPT Solving AI Tasks with ChatGPT and its Friends in Hugging Face
  • java工程重写jar包中class类覆盖问题
  • Mybatis基于注解与XML开发
  • 数字化转型导师坚鹏:数字化时代扩大内需的8大具体建议
  • M1/M2 通过VM Fusion安装Win11 ARM,解决联网和文件传输
  • Linux中显示系统正在运行的进程的命令
  • vite中安装less
  • Aduino中eps环境搭建
  • python——案例二 求两个数的和
  • 一文了解 Android 车机如何处理中控的旋钮输入?
  • 小红书推广 方法总结
  • 通讯录的实现(超详细)——C语言(进阶)
  • 3D 渲染技巧-如何创建高质量写实渲染?
  • fastadmin采坑之获取当前登录admin用户的信息
  • 【Spring AOP + 自定义注解 + 动态数据源 实现主从库切换读写分离】—— 案例实战
  • 【LeetCode每日一题合集】2023.7.24-2023.7.30
  • 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(14)-Fiddler断点(breakpoints)实战,篡改或伪造数据
  • ELK + Fliebeat + Kafka日志系统
  • Scaling Instruction-Finetuned Language Models
  • rust 闭包函数
  • MySQL 实现分库和分表的备份 2023.7.29
  • 20230728----重返学习-跨域-模块化-webpack初步
  • [SQL挖掘机] - 多表连接: union all
  • TypeError: run() got an unexpected keyword argument ‘hide_label‘ yolov5最新版本报错
  • 什么是Java中的集成测试?
  • 打卡力扣题目二
  • 【Qt】QML-02:QQuickView用法
  • 【IDEA】idea不自动生成target