python、go观察者模式

观察者模式,核心在于

  1. 被观察者的信息发生改变会通知观者者
  2. 被观察者可以添加和删除观察者
  3. 观察者需要有更新的行为

python实现

# 观察者
class Observer:def __init__(self, name):self.name = namedef update(self, content):print(f"【{self.name}】接收到消息:【{content}】")# 被观察者
class Subject:def __init__(self):self.observers = []self.msg = ""def attach(self, observer: Observer):self.observers.append(observer)def detach(self, observer: Observer):self.observers.remove(observer)def notify(self, content: str):self.msg = contentfor observer in self.observers:observer.update(self.msg)if __name__ == '__main__':# 创建被观察者s = Subject()# 观察者o1 = Observer(name="小明")o2 = Observer(name="小红")s.attach(o1)s.attach(o2)s.notify("更新消息了")

go 实现

package mainimport ("fmt"
)// 观察者
type Observer struct {name string
}func NewObserver(name string) Observer {return Observer{name: name}
}
func (o *Observer) Update(content string) {content = fmt.Sprintf("【%s】接受到消息:【%s】\n", o.name, content)fmt.Println(content)
}// 被观察者
type Subject struct {Observers []*Observermsg       string
}func NewSubject() Subject {return Subject{}
}// 添加观察者
func (s *Subject) attach(observer *Observer) {s.Observers = append(s.Observers, observer)
}// 删除观察者
func (s *Subject) detach(observer *Observer) {var newObservers []*Observerfor _, o := range s.Observers {if o != observer {newObservers = append(newObservers, o)}}s.Observers = newObservers
}// 被观察者通知消息
func (s *Subject) notify(msg string) {s.msg = msgfor _, observer := range s.Observers {observer.Update(s.msg)}
}
func main() {// 创建被观察者s := NewSubject()// 创建观察者o1 := NewObserver("小明")o2 := NewObserver("小红")// 添加观察者s.attach(&o1)s.attach(&o2)s.notify("更新消息了")s.detach(&o1)s.notify("有更新消息了")
}

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

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

相关文章

【半监督医学图像分割 2023 CVPR】PatchCL

文章目录 【半监督医学图像分割 2023 CVPR】PatchCL摘要1. 简介2. 相关工作2.1 半监督学习2.2 对比学习 3. 方法3.1 类感知补丁采样3.2 伪标记引导对比损失3.3 总体学习目标3.4 伪标号生成与求精 4. 实验5. 结果 【半监督医学图像分割 2023 CVPR】PatchCL 论文题目:…

java: 错误: 不支持发行版本 5 java: 错误: 不支持发行版本8 java: 错误: 不支持发行版本17

🍓🍓原因 该错误表示你使用的Java编译器不支持Java 5版本的发行。Java版本的发行是根据不同的功能和语言变化来区分的。 要解决这个问题,你可以尝试以下几种方法: 检查编译器配置:确保你的IDE或编译器已正确配置为使…

【C++初阶】list的模拟实现 附源码

一.list介绍 list底层是一个双向带头循环链表,这个我们以前用C语言模拟实现过,->双向带头循环链表 下面是list的文档介绍: list文档介绍 我们会根据 list 的文档来模拟实现 list 的增删查改及其它接口。 二.list模拟实现思路 既然是用C模拟…

缓存数据一致性探究

缓存数据一致性探究 缓存是一种较低成本提升系统性能的方式,自它面世第一天起就备受广大开发者的喜爱。然而正如《人月神话》中的那句经典的“没有银弹”中所说,软件工程的设计没有银弹。 就像每一次发布上线修复问题的同时,也极易引入新的问…

js中${}的用法

${xx}:是一种前端模板字符串的写法,${}结构包裹着变量xx;这里的$是写法要求。 作为ES6中新增的字符串方法,其作用是配合反单引号实现字符串拼接。代替以前传统复杂的引号双引号与的拼接,简介明了,非常好用。 反单引号&…

Docker学习路线8:容器注册表

容器注册表是Docker容器镜像的集中存储和分发系统。它允许开发人员以这些镜像的形式轻松共享和部署应用程序。容器注册表在容器化应用程序的部署中发挥着关键作用,因为它们提供了一种快速、可靠和安全的方式,在各种生产环境中分发容器镜像。 以下是当今…

[centos]安装mysql8.0.26

1、首先,根据自己的机子到MySQL官网下载对应的数据库https://dev.mysql.com/downloads/mysql/ 2、卸载mariadb,并解压Mysql 3、安装 rpm -ivh mysql-community-common-8.0.26-1.el7.x86_64.rpm --nodeps rpm -ivh mysql-community-libs-8.0.26-1.el7.x…

RT-Thread 学习-Env开发环境搭建(一)

Env是什么 Env 是 RT-Thread 推出的开发辅助工具,针对基于 RT-Thread 操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。 其内置的 menuconfig 提供了简单易用的配置剪裁工具,可对内核、组件和软件包进行自由裁剪&…

idea新建xml模板设置,例如:mybatis-config

在idea怎么新建mapper.xml文件&#xff0c;具体操作步骤和结果如下&#xff0c;其他文件也是可以自定义模板的流程和步骤一致&#xff01; 效果如下&#xff1a; 步骤如图&#xff1a; step1&#xff1a; step2&#xff1a; 文件内容&#xff1a; <?xml version"…

udp传输大数据的原理和相关问题注意事项

UDP协议本身不提供大数据传输的分片、重组、丢包重传等功能&#xff0c;因此需要对大数据传输进行特殊处理。以下是UDP传输大数据一些常见的处理方法。 &#xff08;1&#xff09;对大文件进行分块&#xff1a;将大文件划分为多个小块进行传输&#xff0c;每个小块都可以使用UD…

安装k8s-ubuntu补充

原文链接&#xff1a;k8s安装——ubuntu_ubuntu安装k8s_流夏_的博客-CSDN博客 kubeadm init 安装docker2 按照 kubeadm config images list的结果去拉取对应的镜像 国内仓库地址registry.cn-hangzhou.aliyuncs.com/google_containers/ rootzkys:/home/k8s_yaml_install# kube…

IntelliJ IDEA 2023.2 新版本即将发布,拥抱 AI

IntelliJ IDEA 近期连续发布多个EAP版本&#xff0c;官方在对用户体验不断优化的同时&#xff0c;也新增了一些不错的功能&#xff0c;尤其是人工智能助手补充&#xff0c;AI Assistant&#xff0c;相信在后续IDEA使用中&#xff0c;会对开发者工作效率带来不错的提升。 以下是…

【SpringBoot】@ConditionalOnProperty 条件注解

SpringBoot ConditionalOnProperty 注解 简介 ConditionalOnProperty&#xff1a;根据属性值来控制类或某个方法是否需要加载。它既可以放在类上也可以放在方法上。 ConditionalOnProperty属性 Retention(RetentionPolicy.RUNTIME) Target({ ElementType.TYPE, ElementType.MET…

GStreamer Playback tutorial 学习笔记(一)

playbin运用 多流处理&#xff1a;一个电影&#xff0c;对应一个视频和多个音频流&#xff08;立体声/5.1声道被视为一个单独的流&#xff09;&#xff0c;以适应不同的语言。在这种情况下&#xff0c;用户选择一个音频流&#xff0c;应用程序只播放选定的音频流&#xff0c;忽…

安卓:Fragment

目录 一、Fragment介绍 二、Fragment的使用方式 &#xff08;一&#xff09;、Fragment静态添加&#xff1a; 静态添加例子&#xff1a; FirstFragment &#xff1a; MainActivity: main_activity: fragment_first: 静态添加的总结&#xff1a; &#xff08;二&…

Android 中app内存回收优化(一):R版本

版本基于&#xff1a;Android R 0. 前言 Android Q 中新增了framework 端app 内存回收优化方案。当app 的 oom adj 发生特定变化时&#xff0c;framework 端会对应用的内存进行处理。随着版本的演变&#xff0c;这部分优化工作也一直在完善&#xff0c;笔者将针对 Android R 和…

Java-通过IP获取真实地址

文章目录 前言功能实现测试 前言 最近写了一个日志系统&#xff0c;需要通过访问的 IP 地址来获取真实的地址&#xff0c;并且存到数据库中&#xff0c;我也是在网上看了一些文章&#xff0c;遂即整理了一下供大家参考。 功能实现 这个是获取正确 IP 地址的方法&#xff0c;可…

脚本定制gitlab官方api获取项目组下的所有项目

脚本说明 通过gitlab官方api接口获取项目组下的所有项目的ssh_git连接并同步项目仓库 #!/bin/bash urlhttps://gitee.xxxxx.cn dir/usr/src/redmine/git-repo group_id69 token2dskWweijirdrrm9UERvcd ${dir}#获取所有项目ssh_url_to_repo curl -s "${url}/api/v4/group…

域内信息收集

将网络中多台计算机逻辑上组织到一起进行集中管理&#xff0c;这种区别于工作组的逻辑环境叫 做域。域是由域控制器(Domain Controller)和成员计算机组成&#xff0c;域控制器就是安装了活动 目录(Active Directory)的计算机。活动目录提供了存储网络上对象信息并使用网络使用该…

uniapp H5预览PDF文件

1&#xff0c;下载资源后hybrid文件存放在static静态文件里 (点击这里去下载文件) 2&#xff0c;pdf预览页面配置 <template><view style"width: 100vh;"><web-view :src"pdfUrl"></web-view></view> </template><…