我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python面试题——设计模式之观察者模式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python面试题——设计模式之观察者模式

在这里插入图片描述

1、观察者模式

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

观察者模式又称:"发布-订阅"模式。

比如,微信公众号,就是一种观察者模式的应用:
一个公众号对应了多个(N)个 订阅者,公众号发布了新的文章,所有的订阅者都会被通知并更新。
也就相当于,我们所有的订阅者就是观察者,我们观察这个公众号(发布者),他一更新,我们就能知道.

在这里插入图片描述
在这里插入图片描述

2、哪些情况下适用于观察者模式:

当一个抽象模型有两个方面,其中一个方面的操作依赖于另外一个方面的状态变化。
如果在更改一个对象的时候,需要同时连带改变其他的对象,而且不知道究竟应该有多少对象需要被连带改变
当一个对象必须通知其他对象,但是你又希望这个对象和其他被通知对象是松耦合的。

3、观察者模式的角色(使用我们前面学习的抽象基类):

抽象的发布者(Subject)
具体的发布者(ConcreteSubject)
抽象的观察者(Observer)
具体的观察者(ConcreteObserver)

4、观察者模式的结构

在这里插入图片描述

5、代码实现

from abc import ABC,abstractmethod#抽象的观察者(抽象基类)class Observer(ABC):    @abstractmethod    def update(self,subject):        pass#抽象的发布者class Subject(ABC):    def __init__(self):        self.observer_list=[]    #抽象方法,添加观察者    @abstractmethod    def attach(self,obs):        pass    # 抽象方法,移除观察者    @abstractmethod    def detach(self, obs):        pass    # 抽象方法,通知观察者    @abstractmethod    def notify(self,abs):        pass#具体的发布者class ConcreteSubject(Subject):    def __init__(self,name):        super().__init__()        self.name = name        #新文章        self.new_text=''    #具体的添加观察者方法    def attach(self,obs):        self.observer_list.append(obs)    # 具体的移除观察者方法    def detach(self, obs):        pass    # 具体的通知观察者方法(通知所有的观察者)    def notify(self):        for obs in self.observer_list:            obs.update(self)    #写文章的方法    def write_text(self,text):        self.new_text=text        self.notify()#具体的观察者(订阅者)class ConcreteObserver(Observer):    def __init__(self,name):        self.name=name        self.read_list=[]    def update(self, subject):        self.read_list.append( {'公众号': subject.name, '文章': subject.new_text} )        print(self.name, '您有新的公众号推送', '\n', self.read_list)# 实例化一个 发布者aMen = ConcreteSubject('阿门')# 实例化 2个 具体的订阅者(观察者, 微信用户)zhangsan = ConcreteObserver('张三')lisi = ConcreteObserver('李四')# 发布者添加 订阅者(观察者)aMen.attach(zhangsan)aMen.attach(lisi)# 阿门公众号 更新文章aMen.write_text('云中歌')# 实例化另一个公众号erGeng = ConcreteSubject('二更')erGeng.attach(zhangsan)erGeng.attach(lisi)erGeng.write_text('发现身边不知道的美')

执行结果:
张三 您有新的公众号推送
[{‘公众号’: ‘阿门’, ‘文章’: ‘云中歌’}]
李四 您有新的公众号推送
[{‘公众号’: ‘阿门’, ‘文章’: ‘云中歌’}]
张三 您有新的公众号推送
[{‘公众号’: ‘阿门’, ‘文章’: ‘云中歌’}, {‘公众号’: ‘二更’, ‘文章’: ‘发现身边不知道的美’}]
李四 您有新的公众号推送
[{‘公众号’: ‘阿门’, ‘文章’: ‘云中歌’}, {‘公众号’: ‘二更’, ‘文章’: ‘发现身边不知道的美’}]

在这里插入图片描述

在这里插入图片描述

来源地址:https://blog.csdn.net/YZL40514131/article/details/126415509

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python面试题——设计模式之观察者模式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

设计模式-观察者模式(Observer)

讲故事(user story)假设我们是一个优惠券提供平台,故事就发生在顾客在我们平台采购完成支付成功后。支付完成后平台要进行的一些操作:短信通知客户已经生成订单增加顾客的积分开始按订单需求制券​ 。。。(可能会有许多操作)接下来就是将故事以代码的形式展
设计模式-观察者模式(Observer)
2018-06-15

PHP设计模式之观察者模式浅析

观察者模式是极其重要的一个设计模式,也是我几年开发过程中使用最多的设计模式,本文首先概述观察者模式的基本概念和Demo实现,接着是观察者模式在Java和Spring中的应用,最后是对观察者模式的应用场景和优缺点进行总结
2023-05-14

Java设计模式中的观察者模式

观察者模式定义对象之间的一种一对多的依赖关系,使得每当一个对象的状态发生变化时,其相关的依赖对象都可以得到通知并被自动更新。主要用于多个不同的对象对一个对象的某个方法会做出不同的反应
2023-02-16

PHP设计模式之观察者模式怎么实现

这篇文章主要介绍“PHP设计模式之观察者模式怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP设计模式之观察者模式怎么实现”文章能帮助大家解决问题。PHP观察者模式(Observer Pa
2023-07-05

PHP设计模式中观察者模式讲解

本文实例讲述了PHP设计模式之观察者模式定义与用法。分享给大家供大家参考,观察者模式当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新
2022-11-13

PHP设计模式中观察者模式详解

观察者模式是极其重要的一个设计模式,也是我几年开发过程中使用最多的设计模式,本文首先概述观察者模式的基本概念和Demo实现,接着是观察者模式在Java和Spring中的应用,最后是对观察者模式的应用场景和优缺点进行总结
2022-12-20

JavaScript观察者模式:揭秘设计模式的奥妙

本文通过对JavaScript观察者模式的深入分析,阐述观察者模式的设计思想和应用场景。通过代码示例,展示如何使用观察者模式轻松构建灵活、可扩展的应用程序。
JavaScript观察者模式:揭秘设计模式的奥妙
2024-02-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录