python模式设计代码之观察者模式

1、观察者模式

话题订阅模式。观察者模式有两个角色,分别是话题发布者和话题订阅者(即观察者)。发布者就是把消息发送给话题,观察者就是订阅这个话题从而得到最新的资讯。这个模式的作用就拿手机的消息推送来说,app身为观察者提前订阅好话题,一旦发布者把信息发送给话题,所有的观察者就会收到这个信息。
在这里插入图片描述

2、观察者模式简单代码

定义发布者

class Subject:def __init__(self):self._observers = []def attach(self, observer):self._observers.append(observer)def detach(self, observer):self._observers.remove(observer)def notify(self,message):for observer in self._observers:observer.update(self, message)

定义观察者

class Observer:def update(self, subject,message):passclass ConcreteObserverA(Observer):def update(self, subject,message):print("ConcreteObserverA: {message}")class ConcreteObserverB(Observer):def update(self, subject,message):print("ConcreteObserverB: {message}")

使用观察者模式

# 创建主题对象
subject = Subject()# 创建观察者对象
observer_a = ConcreteObserverA()
observer_b = ConcreteObserverB()# 注册观察者到主题
subject.attach(observer_a)
subject.attach(observer_b)# 模拟主题状态改变并通知观察者
subject.notify()# 输出:
# ConcreteObserverA: Reacted to the event
# ConcreteObserverB: Reacted to the event

实际案例:和twisted联合运用

from twisted.internet.protocol import ReconnectingClientFactory, Protocol
from twisted.protocols.basic import LineReceiver
from twisted.internet.endpoints import TCP4ClientEndpoint
from twisted.internet import reactor
class Subject:"""定义发布者"""def __init__(self):self._observers = []def attach(self, observer):self._observers.append(observer)def detach(self, observer):self._observers.remove(observer)def notify(self,message):for observer in self._observers:observer.update(self, message)class Observer:"""定义观察者"""def update(self, subject,message):passclass ConcreteObserverA(Observer):"""观察者A"""def update(self, subject,message):print(f"观察到{message}")class ConcreteObserverLog(Observer):def update(self, subject,message):print(f"{message}正在写入日志文件")class  ClientProtocol(LineReceiver): "客户端数据接受及处理模块"  #根据帧尾巴解决粘包 delimiter  = b'\x5F\x5F\x65\x6E\x64\x5F\x5F'def __init__(self):#开一个线程,可以不断接受客户端用户的输入、点击动作之类的,而不影响主线程reactor.callInThread(self.user_input)#初始化发布者,赋值给self.subject,用来发布信息用self.subject.notify(message)self.subject = Subject()#初始化观察者a和观察者bobserver_a = ConcreteObserverA()observer_b = ConcreteObserverLog()#观察者a和观察者b订阅self.subject发布的话题,使用attach订阅self.subject.attach(observer_a)sself.ubject.attach(observer_b)def connectionLost(self, reason):print("Disconnected from the server!") def lineReceived(self, line):#不断地接受服务端的信息;websocket、tcp协议等长连接会一直收到服务器信息#这里通过发布者subject.notify,不断地把新消息发布到话题上,这样每次有新消息#观察者的信息就会更新,并对应动作,比如写入日志文件、打印到终端self.subject.notify(line)def user_input(self):while True:the_input = input("请输入命令(输入'exit'退出): ")if command_key == 'EXIT':print("正在退出...")self.transport.loseConnection()breakclass ClientFactory(ReconnectingClientFactory):"""Tcp 连接模块"""def startedConnecting(self, connector):print('Started to connect.')def buildProtocol(self, addr):print('Connected.')return ClientProtocol()def clientConnectionLost(self, connector, reason):print('Lost connection.  Reason:', reason)def clientConnectionFailed(self, connector, reason):print('Connection failed. Reason:', reason)ReconnectingClientFactory.clientConnectionFailed(self, connector, reason)   
#运行起来twisted 
ClientInput = ClientFactory()
sender_endpoint = TCP4ClientEndpoint(reactor, "192.168.1.100", 9981)
sender_endpoint.connect(ClientInput)
reactor.run()       

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/396225.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch的学习(四):elasticsearch的一些基本概念

简介 elasticsearch的一些基本概念。 核心概念 索引:一个拥有相似特征的文档的集合。 类型:在索引中定义,是索引的一个逻辑上的分类,版本7以上已经弃用了。 文档:可被索引的基础信息单元,即一条数据&a…

Linux 错误码

目录 一、概述二、含义三、错误处理函数1、IS_ERR2、strerr、perror 一、概述 在 Linux 系统中,错误码是用来表示操作系统运行过程中发生的错误的数字代码。错误码通常由负数表示,0 表示成功,正数表示警告或其他非致命错误。 为了开发者更好…

【Linux基础】Linux基本指令(二)

目录 &#x1f680;前言一&#xff0c;mv指令二&#xff0c;more & less指令2.1 more 指令2.1 less指令 三&#xff0c;重定向技术(重要)3.1 echo指令3.2 输出重定向 >3.3 追加重定向 >>3.4 输入重定向 < 四&#xff0c;head & tail指令4.1 head 指令4.2 t…

【经验分享】ShardingSphere+Springboot-04:自定义分片算法(COMPLEX/STANDARD)

文章目录 3.4 CLASS_BASED 自定义类分片算法3.4.1 复杂分片自定义算法&#xff08;strategyCOMPLEX &#xff09;3.4.2 STANDARD 标准分片自定义算法## 进阶:star: 自定义算法范围查询优化 3.4 CLASS_BASED 自定义类分片算法 3.4.1 复杂分片自定义算法&#xff08;strategyCOM…

VUE结合elementui实现分页器列表

<template><div>外贸知识<div class"art-box"><div class"art-item-box"><div class"art-item" v-for"(art, index) in paginatedArtList" :key"index"><a :href"art.artsrc"&g…

离开SD的大佬们另组战队,开源新品牌冲击MJ王座

FLUX.1强势登场&#xff0c;秒杀Midjourney&#xff1f; Midjourney 6.1 才发表几天&#xff0c;FLUX.1立刻就来踢馆了 离职四个月&#xff0c;Stability AI 核心成员 Robin Rombach 前几日官宣成立了 Black Forest Labs&#xff0c;公司推出的第一个产品 FLUX.1&#xff0c;…

GStreamer 简明教程(一):环境搭建,运行 Basic Tutorial 1 Hello world!

文章目录 前言一、源码环境搭建二、Basic Tutorial 1 Hello world三、开启更多日志参考 前言 本系列文章将纪录学习 [GStreamer] 的过程。 为什么想学习 [GStreamer]&#xff0c;有这么几个原因&#xff1a; 多媒体处理是一个复杂的任务&#xff0c;[GStreamer] 的管道架构可…

Docker最佳实践(七):安装MinIO文件服务器

大家好&#xff0c;欢迎各位工友。 Minio是一个开源免费的高性能对象存储服务器&#xff0c;专为大规模数据集和高并发访问而设计。它具有出色的读写性能和低延迟&#xff0c;可以满足对数据速度和效率要求较高的应用场景。本篇呢我们就来演示一下如何在Docker中搭建Minio容器&…

Java的线程实现

我们知道&#xff0c;线程是比进程更轻量级的调度执行单位&#xff0c;线程的引入&#xff0c;可以把一个进程的资源分配和执行调度分开&#xff0c;各个线程既可以共享进程资源&#xff08;内存地址、文件I/O等&#xff09;&#xff0c;又可以独立调度。目前线程是Java里面进行…

智能分析,安全无忧:AI视频分析技术在安全生产中的深度应用

在当今快速发展的科技时代&#xff0c;视频智能分析技术&#xff08;Intelligent Video Analysis&#xff0c;简称IV&#xff09;已经成为提升安全生产水平的重要手段。这一技术通过计算机图像视觉分析技术&#xff0c;实现了对场景中目标的自动识别和追踪&#xff0c;有效提升…

【层归一化用于单个样本适合于序列建模,通俗】

层归一化&#xff08;Layer Normalization&#xff09;&#xff0c;简称 LayerNorm&#xff0c;会将神经网络层的激活值规范到均值为0&#xff0c;并将其方差归一化为1。尤其是在循环神经网络&#xff08;RNNs&#xff09;和自注意力模型&#xff08;如 Transformers&#xff0…

【学习笔记】Day 8

写在开头&#xff1a; 最近老板突然提出一个全新的组会主题&#xff0c;是关于 “最近我犯的傻”&#xff0c;其目的在于提供乐子的同时引以为戒。本来我还在愁到底去哪里找干的啥事儿&#xff0c;结果今天直接拉了个大的。什么叫无心插柳柳成荫啊&#xff0c;悲。 一…

【C++进阶】红黑树

目录 什么是红黑树&#xff1f;红黑树红黑树的性质 定义红黑树红黑树的操作insertinorderfindheightsize构造函数析构函数赋值拷贝判断红黑树 全部代码总结 什么是红黑树&#xff1f; 红黑树 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff…

lora通信模块工作模式(半双工)

一&#xff0c;工作模式 1&#xff0c;透明模式 2&#xff0c;定点模式 3&#xff0c;广播模式 测试结果 1&#xff0c;定点模式下两个必须都是定点模式才能通信 2&#xff0c;广播模式可以发送到透明模式 3&#xff0c;定点模式发送不了透明模式

【Python第三方库】Requests全面解析

文章目录 安装基本用法测试网站发送GET请求发送POST请求更多请求请求参数请求头其他常用请求属性处理响应响应状态码响应内容 处理超时处理异常 requests 是一个非常流行的 Python HTTP 库&#xff0c;用于发送所有类型的 HTTP 请求。它简洁易用&#xff0c;能够处理复杂的请求…

数据结构——栈的讲解(超详细)

前言&#xff1a; 小编已经在前面讲完了链表和顺序表的内容&#xff0c;下面我们继续乘胜追击&#xff0c;开始另一个数据结构&#xff1a;栈的详解&#xff0c;下面跟上小编的脚步&#xff0c;开启今天的学习之路&#xff01; 目录 1.栈的概念和结构 1.1.栈的概念 1.2.栈的结构…

Vatee万腾平台:数据智能的创新引擎,引领企业数字化转型新纪元

在数字化转型的浪潮中&#xff0c;企业正以前所未有的速度重构着自身的运营模式与核心竞争力。作为这一变革的领航者&#xff0c;Vatee万腾平台凭借其卓越的数据智能能力&#xff0c;正逐步揭开企业数字化转型的新篇章。本文将深入探讨Vatee万腾平台如何以数据为核心&#xff0…

【多线程基础】进程和线程的区别和联系(重要)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Java多线程 &#x1f4da;本系列文章为个人…

【JavaEE】CAS原理

目录 ​前言 什么是CAS&#xff1f; 如何使用CAS&#xff1f; CAS实现自旋锁 CAS的ABA问题 面试题 1.讲解下你自己理解的CAS机制 2.ABA问题怎么解决&#xff1f; 前言 在多线程中&#xff0c;多个线程同时对一个共享变量进行读写操作&#xff0c;那么就会出现线程安全问…

01 NoSQL之Redis配置与优化

目录 1.1 Redis介绍 1.1.1关系数据库与非关系型数据库 1 . 关系型数据库 2. 非关系型数据库 3.非关系型数据库产生背景 (1) High performance--对数据库高并发读写需求 &#xff08;2) Huge Storage--对海量数据高效存储与访问需求 &#xff08;3) High Scalability …