当前位置: 首页 > news >正文

安卓常见设计模式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!

相关文章:

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

1. W1 是什么&#xff0c;什么是观察者模式&#xff1f;​ 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;用于实现组件间的松耦合通信。主要对象有观察者接口&#xff08;Observer&#xff09;和可观察对象&#xff08;Observable&…...

USB偏好设置-Android13

USB偏好设置 1、USB偏好设置界面和入口2、USB功能设置2.1 USB功能对应模式2.2 点击设置2.3 广播监听刷新 3、日志开关3.1 Evet日志3.2 代码中日志开关3.3 关键日志 4、异常 1、USB偏好设置界面和入口 设置》已连接的设备》USB packages/apps/Settings/src/com/android/setting…...

Ubuntu 22.04 (WSL) 安装 libssl1.1

废话不多说&#xff01;&#xff01;&#xff01; 步骤一&#xff1a; echo "deb http://security.ubuntu.com/ubuntu focal-security main" | sudo tee /etc/apt/sources.list.d/focal-security.list 步骤二&#xff1a; sudo apt-get update 步骤三&#xff1a…...

数据结构-图的课后习题(2)

题目要求&#xff1a; 对于下面的这个无向网&#xff0c;给出&#xff1a; 1.“深度优先搜索序列”&#xff08;从V1开始&#xff09; 2.“广度优先序列”&#xff08;从V1开始&#xff09; 3.“用Prim算法求最小生成树” 代码实现&#xff1a; 1.深度优先搜索&#xff1a…...

[Machine Learning] 多任务学习

文章目录 基于参数的MTL模型 (Parameter-based MTL Models)基于特征的MTL模型 (Feature-based MTL Models)基于特征的MTL模型 I&#xff1a;基于特征的MTL模型 II&#xff1a; 基于特征和参数的MTL模型 (Feature- and Parameter-based MTL Models) 多任务学习 (Multi-task Lear…...

【C语言从入门到放弃 6】递归,强制类型转换,可变参数和错误处理详解

C语言是一种功能强大的编程语言&#xff0c;具有许多高级特性&#xff0c;包括强制类型转换&#xff0c;递归&#xff0c;可变参数和错误处理。在本文中&#xff0c;我们将深入了解这些特性&#xff0c;并提供简单的示例来帮助理解。 递归 递归是一种函数调用自身的技术&…...

使用LLama和ChatGPT为多聊天后端构建微服务

微服务架构便于创建边界明确定义的灵活独立服务。这种可扩展的方法使开发人员能够在不影响整个应用程序的情况下单独维护和完善服务。然而&#xff0c;若要充分发挥微服务架构的潜力、特别是针对基于人工智能的聊天应用程序&#xff0c;需要与最新的大语言模型&#xff08;LLM&…...

CSS3 用户界面、图片、按钮

一、CSS3用户界面&#xff1a; 在CSS3中&#xff0c;增加了一些新的用户界面特性来调整元素尺寸、框尺寸和外边框。CSS3用户界面属性&#xff1a;resize、box-sizing、outline-offset。 1、resize&#xff1a; resize属性指定一个元素是否应该由用户去调整大小。 <style…...

说说对Redux中间件的理解?常用的中间件有哪些?实现原理?

一、是什么 中间件&#xff08;Middleware&#xff09;是介于应用系统和系统软件之间的一类软件&#xff0c;它使用系统软件所提供的基础服务&#xff08;功能&#xff09;&#xff0c;衔接网络上应用系统的各个部分或不同的应用&#xff0c;能够达到资源共享、功能共享的目的…...

【已验证】php配置连接sql server中文乱码(解决方法)更改utf-8格式

解决数据库中的中文数据在页面显示乱码的问题 在连接的$connectionInfo中设置"CharacterSet" > "UTF-8"&#xff0c;指定编码方式即可 $connectionInfo array("UID">$uid, "PWD">$pwd, "Database">$database…...

《未来之路:技术探索与梦想的追逐》

创作纪念日 日期&#xff1a;2023年07月05日文章标题&#xff1a;《从零开始-与大语言模型对话学技术-gradio篇&#xff08;1&#xff09;》成为创作者第128天 在这个平凡的一天&#xff0c;我撰写了自己的第一篇技术博客&#xff0c;题为《从零开始-与大语言模型对话学技术-…...

vue3 自动导入composition-apiI和组件

1.api的自动导入 常规写法&#xff1a; <script setup>import { ref, reactive, onMounted, computed ,watch } from vue;import { useRouter } from "vue-router";const router useRouter();const person reactive ({name&#xff1a;张三&#xff0c;age…...

LeetCode15-三数之和

本文最精华的就是下面的视频讲解! &#x1f517;:参考的视频讲解 class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ans new ArrayList<>();Arrays.sort(nums);int nnums.length;int i0,j0,k0,sum0;for(…...

安全物理环境(设备和技术注解)

网络安全等级保护相关标准参考《GB/T 22239-2019 网络安全等级保护基本要求》和《GB/T 28448-2019 网络安全等级保护测评要求》 密码应用安全性相关标准参考《GB/T 39786-2021 信息系统密码应用基本要求》和《GM/T 0115-2021 信息系统密码应用测评要求》 1物理位置选择 1.1机房…...

箭头函数 跟匿名函数this的指向问题

var id 10; function foo() {// 创建时 this->windowthis.id 20; // 等价于 window.id 20let c () > {console.log("id1:", this.id); // 创建时父级 创建时 this->window};let d function () {console.log("id2:", this.id); // 执行时本…...

Java Stream:List分组成Map或LinkedHashMap

在Java中&#xff0c;使用Stream API可以轻松地对集合进行操作&#xff0c;包括将List转换为Map或LinkedHashMap。本篇博客将演示如何利用Java Stream实现这两种转换&#xff0c;同时假设List中的元素是User对象。 1. 数据准备 List<User> list new ArrayList<>(…...

vue2+elementui使用MessageBox 弹框$msgbox自定义VNode内容:实现radio

虽说实现下面的效果&#xff0c;用el-dialog很轻松就能搞定。但是这种简单的交互&#xff0c;我更喜欢使用MessageBox。 话不多说&#xff0c;直接上代码~ <el-button type"primary" size"mini" click"handleApply()" >处理申请</el-b…...

OC 实现手指滑动拖动View

RPReplay_Final1699613924 实现手指滑动拖动View 支持手势移动的控件 支持 Masonry frame 布局 使用富文本 也支持自动高度 核心代码 - (void)handlePanGesture:(UIPanGestureRecognizer *)p {CGPoint panPoint [p locationInView:self.view];CGPoint currentViewPoint _dr…...

多级缓存之实现多级缓存

多级缓存的实现离不开Nginx编程&#xff0c;而Nginx编程又离不开OpenResty。 1. OpenResty快速入门 我们希望达到的多级缓存架构如图&#xff1a; 其中&#xff1a; windows上的nginx用来做反向代理服务&#xff0c;将前端的查询商品的ajax请求代理到OpenResty集群 OpenRest…...

React【axios、全局处理、 antd UI库、更改主题、使用css module的情况下修改第三方库的样式、支持sass less】(十三)

文件目录 Proxying in Development http-proxy-middleware fetch_get fetch 是否成功 axios 全局处理 antd UI库 更改主题 使用css module的情况下修改第三方库的样式 支持sass & less Proxying in Development 在开发模式下&#xff0c;如果客户端所在服务器跟后…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...