安卓常见设计模式12------观察者模式(Kotlin版、Livedata、Flow)

1. W1 是什么,什么是观察者模式?​

  1. 观察者模式(Observer Pattern)是一种行为型设计模式,用于实现组件间的松耦合通信。
  2. 主要对象有观察者接口(Observer)和可观察对象(Observable)。

2. W2 为什么,为什么需要使用观察者模式,能给我们编码带来什么好处?​

  1. 解耦性(Decoupling):观察者模式可以降低组件之间的耦合度。观察者和被观察者之间是松散耦合的关系,它们之间只通过定义的接口进行通信。这样一来,当一个被观察者发生变化时,它并不关心具体观察者是谁以及观察者的数量和类型。同样,一个观察者也不需要关心被观察者的具体实现。这种解耦性使得代码更加灵活、可维护和可扩展。

  2. 可重用性(Reusability):通过使用观察者模式,可以将观察者和被观察者分开,使它们可以独立地进行重用。这使得我们可以在不同的上下文中重复使用同一个观察者和被观察者,而无需修改它们的实现。这提高了代码的重用性,减少了重复编写相似功能的工作量。

  3. 扩展性(Extensibility):观察者模式使得系统更易于扩展。当需要添加新的观察者或被观察者时,只需实现相应的接口即可,而无需修改现有的代码。这种扩展性使得系统能够灵活地适应变化和需求的增加,而不会影响已有的功能和模块。

  4. 即时通知(Immediate Notification):通过观察者模式,当被观察者的状态发生变化时,观察者可以立即获得通知。这样可以实现实时的数据更新和反馈,提供良好的用户体验。观察者可以根据自身的需求和逻辑对接收到的数据进行处理,例如更新UI、执行特定操作等。

  5. 多态性(Polymorphism):观察者模式利用了多态性的特性。观察者可以是不同类的实例,只要它们遵循相同的观察者接口。这种多态性使得我们可以在运行时动态地添加、删除和替换观察者,而无需修改现有的代码。这种灵活性和可扩展性使得系统更具适应性和可配置性。

3. W3,如何使用?下面是代码示例:

定义观察者接口(Observer):

interface Observer {fun update(data: Any)
}

定义可观察对象(Observable):

class Observable {private val observers: MutableList<Observer> = mutableListOf()fun addObserver(observer: Observer) {observers.add(observer)}fun removeObserver(observer: Observer) {observers.remove(observer)}fun notifyObservers(data: Any) {for (observer in observers) {observer.update(data)}}
}

实现观察者:

class MyObserver : Observer {override fun update(data: Any) {// 处理接收到的数据println("Received data: $data")}
}

示例代码:

fun main() {val observable = Observable()val observer1 = MyObserver()val observer2 = MyObserver()observable.addObserver(observer1)observable.addObserver(observer2)// 模拟发送数据observable.notifyObservers("Hello, World!")observable.removeObserver(observer2)// 再次发送数据observable.notifyObservers("Hi!")// 输出:// Received data: Hello, World!// Received data: Hello, World!// Received data: Hi!
}

平时开发过程中我们一般使用一些封装好了的Observer,下面是一些例子:

  1. 使用LiveData
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveDataobject XXXXController {private val _data = MutableLiveData<String>()val data: LiveData<String> = _datafun updateData(data: String) {_data.value = data}
}fun main() {XXXXController.data.observe(this@XXXActivity){// 处理接收到的数据println("Received data: $it")}
}
  1. 使用Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlowobject XXXXController {private val _data = MutableStateFlow<String>("")val data: StateFlow<String> = _datafun updateData(data: String) {_data.value = data}
}fun main() {lifecycleScope.launch {XXXXController.data.collect { data ->// 处理接收到的数据println("Received data: $data")}}
}

Thank you for your reading, best regards!

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

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

相关文章

WPF ToggleButton 主题切换动画按钮

WPF ToggleButton 主题切换动画按钮 仿造最近看到的html中的一个效果&#xff0c;大致思路是文章这样&#xff0c;感觉还可以再雕琢一下。 代码如下 XAML: <UserControl x:Class"WPFSwitch.AnimationSwitch"xmlns"http://schemas.microsoft.com/winfx/200…

NFS服务器的搭建

架设一台NFS服务器&#xff0c;并按照以下要求配置 准备阶段&#xff1a;准备两台虚拟机&#xff0c;一台作为服务端&#xff0c;一台作为客户端 服务端&#xff08;Server&#xff09;&#xff1a;192.168.75.139 客户端&#xff08;Client&#xff09;:192.168.75.160 两…

密码学 - RSA签名算法

实验九 RSA签名算法- 一、实验目的 通过实验掌握GMP开源软件的用法&#xff0c;理解RSA数字签名算法&#xff0c;学会RSA数字签名算法程序设计&#xff0c;提高一般数字签名算法的设计能力。 二、实验要求 (1)基于GMP开源软件&#xff0c;实现RSA签名算法。 (2)要求有对应…

远程运维的定义以及优点详细讲解-行云管家

对于IT运维小伙伴而言&#xff0c;远程运维是最平常不过的一件事情了。比如下班了需要工作&#xff0c;可以远程运维就好了&#xff1b;比如帮助用户远程安装远程运维软件等等。今天我们就一起来简单聊聊远程运维的定义以及优点&#xff0c;顺便看看市面上哪款远程运维软件好用…

pytorch搭建squeezenet网络的整套工程(升级版)

上一篇当中&#xff0c;使用pytorch搭建了一个squeezenet&#xff0c;效果还行。但是偶然间发现了一个稍微改动的版本&#xff0c;拿来测试一下发现效果会更好&#xff0c;大概网络结构还是没有变&#xff0c;还是如下的第二个版本&#xff1a; 具体看网络结构代码&#xff1a…

Rust教程7:Gargo包管理、创建并调用模块

文章目录 cargo调用模块创建库调用库 Rust系列&#xff1a;初步⚙所有权⚙结构体和枚举类⚙函数进阶⚙泛型和特征⚙并发和线程通信 cargo cargo是Rust的包管理工具&#xff0c;兼具一些调试功能&#xff0c;在认识cargo之前&#xff0c;我们都是直接新建一个.rs文件&#xff…

python注释(快捷键)

首先介绍以下三种注释方式&#xff1a; # 123&#xff08;单行注释&#xff09; """123"""&#xff08;多行注释&#xff09; 123&#xff08;多行注释&#xff09; 下面介绍一下快捷键&#xff1a; Ctrl/ 注释单行&#xff1a;指针只要在这行代…

Unity Transform接口的几个常用方法解析_unity基础开发教程

Unity Transform接口常用方法解析 1. Transform.position2. Transform.right、Transform.forward、Transform.up3. Transform.Rotate4. Transform.Translate 在Unity中&#xff0c;Transform类是游戏对象位置、旋转和缩放的表示。在日常开发中我们回经常用到Transform接口的几个…

ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR

硬件&#xff1a;ZYNQ7100 软件&#xff1a;Vivado 2017.4、Xilinx SDK 2017.4   ZYNQ PL 和 PS 的通信方式有 AXI GPIO、BRAM、DDR等。对于数据量较少、地址不连续、长度规则的情况&#xff0c;BROM 比较适用。而对于传输速度要求高、数据量大、地址连续的情况&#xff0c;比…

Azure 机器学习 - 使用自动化机器学习训练计算机视觉模型的数据架构

目录 一、用于训练的数据架构图像分类&#xff08;二进制/多类&#xff09;多标签图像分类对象检测实例分段 二、用于联机评分的数据架构输入格式输出格式图像分类&#xff08;二进制/多类&#xff09;多标签图像分类对象检测实例分段 在线评分和可解释性 (XAI) 的数据格式支持…

传输层中的TCP和UPD协议

一)应用层协议简介:根据需求明确要传输的信息&#xff0c;明确要传输的数据格式&#xff1b; 应用层协议:这个协议&#xff0c;实际上是和程序员打交道最多的协议了 1)其它四层都是操作系统&#xff0c;驱动&#xff0c;硬件实现好了的&#xff0c;咱们是不需要管 2)应用层:当我…

动态通讯录及程序保存在文件中

目录 一、结构体改造及增容函数 1.结构体部分 2.初始化函数及增容函数 二、信息添加及销毁和排序 1.信息添加函数&#xff08;Add&#xff09; 2.销毁函数&#xff08;Destroy&#xff09; 3.排序部分&#xff08;qsort&#xff09; 三、通讯录信息保存 1.保存在文件中…

Flutter笔记:光影动画按钮、滚动图标卡片组等

Flutter笔记 scale_design更新&#xff1a;光影动画按钮、滚动图标卡片组 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263…

SpringData、SparkStreaming和Flink集成Elasticsearch

本文代码链接&#xff1a;https://download.csdn.net/download/shangjg03/88522188 1 Spring Data框架集成 1.1 Spring Data框架介绍 Spring Data是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快…

成集云 | 英克对接零售O2O+线上商城 | 解决方案

方案介绍 零售O2O线上商城是一种新型的商业模式&#xff0c;它通过线上和线下的融合&#xff0c;提供更加便捷的购物体验。其中&#xff0c;O2O指的是线上与线下的结合&#xff0c;通过互联网平台与实体店面的结合&#xff0c;实现线上线下的互动和协同。线上商城则是指通过互…

Git的进阶操作,在idea中部署gie

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《git》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这…

[工业自动化-9]:西门子S7-15xxx编程 - PLC主站 - 信号量:模拟量

目录 前言&#xff1a; 一、模拟量模块 1.1 概述 1.2 安装 1.3 模拟量链接线 二、模拟量常见问题 2.1 两线制、四线制&#xff08;电流&#xff09; 2.2 模拟量模块的参数 2.3 差分信号与单端信号 三、如何防止电磁干扰 3.1 概述 3.2 工业现场的电磁干扰源来源 3.…

Hive3 on Spark3配置

1、软件环境 1.1 大数据组件环境 大数据组件版本Hive3.1.2Sparkspark-3.0.0-bin-hadoop3.2 1.2 操作系统环境 OS版本MacOSMonterey 12.1Linux - CentOS7.6 2、大数据组件搭建 2.1 Hive环境搭建 1&#xff09;Hive on Spark说明 Hive引擎包括&#xff1a;默认 mr、spark、…

IP行业API助力于网络分析和数据挖掘

引言 在当今数字化时代&#xff0c;数据成为了企业、科研机构和政府决策者的重要资源&#xff0c;而IP行业API则成为了数据分析及挖掘的工具之一。IP行业API是一种能够查询IP地址所属的行业分类信息的应用程序接口&#xff0c;它能够提供在网络分析、用户行为分析及大数据挖掘…

ChatRule:基于知识图推理的大语言模型逻辑规则挖掘11.10

ChatRule&#xff1a;基于知识图推理的大语言模型逻辑规则挖掘 摘要引言相关工作初始化和问题定义方法实验 摘要 逻辑规则对于揭示关系之间的逻辑联系至关重要&#xff0c;这可以提高推理性能并在知识图谱&#xff08;KG&#xff09;上提供可解释的结果。虽然已经有许多努力&a…