Kotlin观察者模式

news/2025/3/5 1:42:51/

观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。这种模式在许多编程场景中非常有用,例如事件处理、数据绑定和通知系统。

观察者模式的主要组成部分
主题(Subject):维护观察者的列表,并提供添加和删除观察者的方法。当主题的状态发生变化时,它会通知所有观察者。

观察者(Observer):定义了一个更新接口,当主题状态发生变化时,主题会调用观察者的更新方法。

观察者模式的优点
松耦合:观察者模式允许对象之间松耦合,因为它们不需要知道彼此的具体实现。
可扩展性:可以轻松地添加或删除观察者,而不需要修改主题或观察者的代码。
灵活性:观察者模式可以用于实现事件驱动编程,使得系统更加灵活和响应迅速。
观察者模式的缺点
性能问题:当观察者数量较多时,通知所有观察者可能会影响性能。
复杂性:观察者模式可能会增加系统的复杂性,特别是在处理复杂的依赖关系时。

在Kotlin中,观察者模式可以通过接口和类来实现。以下是一个简单的观察者模式的实现示例:

//观察者
interface Observer<in T>{fun update(data:T)
}//被观察者
class Subject<T> {//一个列表,用于保存观察者private val observers = mutableListOf<Observer<T>>()//将观察者添加到列表中。fun attach(observer:Observer<T>){observers.add(observer)}//从列表中移除观察者fun detach(observer:Observer<T>){observers.remove(observer)}
//通知观察者fun notify(data:T){observers.forEach {it.update(data)}}
}//观察者实现
class MyObserver:Observer<String>{override fun update(data: String) {println("Received data:$data")}
}//通过创建一个Subject和一个Observer,将观察者附加到主题上,通知观察者一些数据,分离观察者,然后再次通知以显示分离的观察者不再接收通知
fun main() {val subject = Subject<String>()val observer = MyObserver()subject.attach(observer)subject.notify("hello,World")subject.detach(observer )subject.notify("end edn")}
//打印结果:Received data:hello,World

http://www.ppmy.cn/news/1576699.html

相关文章

Android中的四大组件及其生命周期

Android中的四大组件分别是Activity、Service、Content Provider和BroadcastReceiver&#xff0c;每个组件都有其特定的生命周期。以下是这些组件及其生命周期的详细介绍&#xff1a; 1. Activity 简介&#xff1a;Activity是用户操作的可视化界面&#xff0c;为用户提供了一个…

preg_replace 与 str_replace 的比较与选择

preg_replace 与 str_replace 的比较与选择 ——PHP字符串处理的核心工具深度解析 一、核心功能定位 在PHP的字符串处理中&#xff0c;str_replace和preg_replace是两种最常用的替换函数&#xff0c;但其设计目标和应用场景存在本质差异&#xff1a; str_replace 简单字符串替…

【期末考试应急处理】Linux 历年考试-试题及答案汇总

一、单选 1 . 存放用户帐号的文件是&#xff08;C&#xff09;。 A. shadow B. group C. passwd D. gshadow 2 . 下面哪个系统目录中包含 Linux 使用的外部设备&#xff08;B&#xff09;。 A./bin B./dev C./boot D./home 3 . Linux 系统的联机帮助命令是&#xff08;D&…

【计算机网络】考研复试高频知识点总结

文章目录 一、基础概念1、计算机⽹络的定义2、计算机⽹络的目标3、计算机⽹络的组成4、计算机⽹络的分类5、计算机⽹络的拓扑结构6、计算机⽹络的协议7、计算机⽹络的分层结构8、OSI 参考模型9、TCP/IP 参考模型10、五层协议体系结构 二、物理层1、物理层的功能2、传输媒体3、 …

初探WebAssembly

WebAssembly: 网页应用的性能革命 ​互联网技术日新月异&#xff0c;Web应用已经从简单的网页跃升为功能丰富的平台。然而&#xff0c;JavaScript作为Web的主力语言&#xff0c;在处理计算密集型任务时仍然存在性能瓶颈。今天&#xff0c;我们来聊一聊可能改变Web格局的技术—…

自己的网页加一个搜索框,调用deepseek的API

一切源于一个学习黑马程序员视频的突发奇想 在网页悬浮一个搜索按钮&#xff0c;点击可以实现调用deepseek文本模型回答你的问题 前端实现 前端使用vue实现的 首先是整体页面&#xff1a;AIWidget.vue <template><div><!-- 悬浮 AI 按钮 --><el-button c…

PDF编辑器Icecream PDF Editor(免费)

在日常工作中&#xff0c;我们习惯于首先在Word中精心编辑文档&#xff0c;以确保其对外呈现的专业性&#xff0c;随后将其转换为PDF格式以便发布。一旦PDF生成后偶然发现个别小错误&#xff0c;无需繁琐地返回Word进行修改并重新转换&#xff0c;只需借助Icecream PDF Editor&…

基于JavaWeb开发的Java+SpringBoot+vue+element实现物流管理系统

基于JavaWeb开发的JavaSpringBootvueelement实现物流管理系统 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定…