004.可观察对象与观察者

Rx非常适合事件驱动的应用程序。这是有意义的,因为事件(作为)(如前所述)是创建时变值的命令式方法。从历史上看,事件驱动编程主要出现在客户端技术中,因为作为事件实现的用户交互。例如,你可能工作过使用OnMouseMove或OnKeyPressed事件。正因如此,难怪你看到许多使用Rx的客户端应用程序。此外,一些客户端框架是基于Rx,如ReactiveUI (http://reactiveui.net)。

但是让我向您保证,Rx不是仅限客户端的技术。相反,服务器端代码的许多场景都非常适合Rx。另外,就像我说的在此之前,Rx用于大型应用程序,如Microsoft Cortana、Netflix和使用Microsoft StreamInsight的复杂事件处理(CEP)。Rx是一个优秀的库处理应用程序接收消息,而不管它在服务层或客户端层上运行。

接下来介绍什么是可观察对象。可观察对象(Observables)用于实现时变值(我们定义为可观察对象)序列)在Rx。它们代表推送模型( push model ),在该模型中,新数据被推送到(或)通知)观察者。

可观察对象被定义为事件(或通知)的来源,或者,如果你愿意,也可以定义为数据流的发布者。推送模型意味着,不是让观察者从源中获取数据,而是在数据可用时将其传递给观察者,并总是检查是否有尚未获取的新数据(拉取模型)。

Observable实现IObservable接口,该接口位于.NET4.0的System空间里。

public interface IObservable<T>
{
 IDisposable Subscribe(IObserver<T> observer); 
}

IObservable接口只有一个方法Subscribe,它允许观察者订阅通知。Subscribe方法返回一个Disposable对象,该对象表示订阅,并允许观察者通过调用Dispose方法随时取消订阅。Observables保存订阅的观察者的集合,并在有值得通知的事情时通知他们。这是使用IObserver<T>接口完成的,该接口也位于.NET4.0的System命名空间。如图所示。

public interface IObserver<T>
{
 void OnNext(T value); 
 void OnError(Exception error); 
 void OnCompleted(); 
}

使用IObservable和IObserver的基本流程如图1.6所示。可观察对象并不总是完整的;它们可以是可能无限数量的序列元素(例如无限集合)的提供者。一个可观察对象也可以是“安静”,意思是它从来没有推动过任何元素,也永远不会。可观察对象也可以失败;失败可以发生在可观察对象已经推送了元素之后,也可以在没有任何元素被推动的情况下发生。

这个可观察的代数用下面的表达式形式化(其中*表示零次或多次,?表示零或一次,且“|”为“或”运算符):
在这里插入图片描述
图1.6是被观察者与观察者交互流程。在这个场景中,观察者被订阅到可观察对象应用程序;可观察对象向观察者“推送”三条消息(只有一条)在这种情况下),然后通知观察者它已经完成。

当失败时,将使用OnError方法通知观察器,并使用异常对象将被传递给观察者进行检查和处理(参见
图1.7)。在出现错误之后(以及在完成之后),将不会有更多的消息推给观察员。当观察者不提供错误处理程序时,Rx使用的默认策略是升级异常并导致崩溃。您将在第10章学习如何优雅地处理错误。
在这里插入图片描述
图1.7在可观察对象中出现错误的情况下,观察者将通过带有异常对象的OnError方法得到通知。

观察者设计模式

在某些编程语言中,事件有时作为一等公民提供,这意味着您可以使用所提供的语言定义和注册事件关键字和类型,甚至将事件作为参数传递给函数。
对于不支持事件作为一等公民的语言,使用观察者模式是一个有用的设计模式,允许您向应用程序添加类似事件的支持。此外,.NET的事件就是基于这种模式现实的。
观察者模式是由Gang of Four (GoF)在《设计模式》中引入的:
可重用的面向对象软件的要素(Addison-Wesley Professional, 1994)。该模式定义了两个组件:主体和观察者(不要混淆)(Rx的观察者)。观察者是对事件感兴趣的参与者将自身订阅到引发事件的主题。这是它在统一中的样子建模语言(UML)类图:
在这里插入图片描述
观察者模式很有用,但有几个问题。观察者只有一个方法来接受事件。如果要附加到多个主题或多个
除了一个事件,您还需要实现更多的更新方法。另一个问题是该模式没有指定处理错误的最佳方法,如果有的话,要由开发人员自己寻找通知错误的方法。最后要解决的问题是如何知道主题什么时候完成,Rx IObservable和IObserver基于Observer设计模式,但对其进行了扩展以解决这些问题的缺点。

——未完待续

译者:重庆教主 20240513

网站:WPF中文网 wpfsoft.com

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

构建滴滴业务中台:系统架构设计探索

在当今数字化时代&#xff0c;滴滴作为中国领先的出行平台&#xff0c;承载着数亿用户的出行需求&#xff0c;业务规模庞大且复杂多样。为了更好地支撑业务发展和提升服务质量&#xff0c;滴滴不断探索和构建业务中台&#xff0c;以实现业务的快速响应、灵活运营和持续创新。在…

2024年最新青龙面板跑脚本教程(一)持续更新中

文章目录 步骤 1: 安装青龙面板步骤 2: 访问青龙面板步骤 3: 上传或创建JavaScript脚本步骤 4: 添加定时任务步骤 5: 查看日志示例脚本步骤 6: 管理依赖和环境变量通用依赖如下&#xff0c;可手动增加。 要在青龙面板上运行JavaScript脚本&#xff0c;首先需要确保你已经成功安…

JavaEE之线程(4)——线程安全、线程安全的原因,synchronized关键字

前言 在本栏的前面的内容中&#xff0c;我们介绍了线程的创建、Thread 类及常见方法、线程的状态&#xff0c;今天我们来介绍一下关于线程的另一个重点知识——线程安全。 一、线程安全 基本概念&#xff1a; 线程安全的确切定义是复杂的&#xff0c;但我们可以这样认为&…

阿里云OSS配置跨域及域名访问

1、配置跨域 进入对象存储OSS–>OSS存储桶–>数据安全–>跨域设置–>创建规则 2、配置跨域 Etag x-oss-request-id3、配置结果如下 4、数据源配置 切换到数据管理–>静态页面 配置根页面 保存结果如下 5、配置域名访问 绑定域名 添加txt记录 验证绑定 …

【linux-IMX6ULL-uboot初次编译及烧录

目录 1. uboot基本概念1. 1 uboot的编译 3. uboot的烧录2. uboot的烧录结果 第一次不进行原理性的探究&#xff0c;也不关注源码内容&#xff0c;只是进行一个直观的了解&#xff0c;对uboot进行初次编译并进烧录到IMX6ULL板卡中 1. uboot基本概念 U-Boot&#xff08;Universa…

设计循环队列-C语言实现

题目描述 设计循环队列 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的…

FPGA verilog LVDS通信协议笔记

一幅图胜过千言万语 直接开始挫代码&#xff0c;先写top.v。 module top();reg clk; // 生成时钟的寄存器 reg rst; // 生成复位信号的寄存器initial clk 1; // 初始值取1 always #1 clk ~clk; //1ns取反一次initial begin // 复位信号&#xff0c;先0&#xff0c;过段时间赋…

ORA-00932: inconsistent datatypes: expected - got CLOB的分析解决方案

最近在项目中遇到查询数据时报ORA-00932: inconsistent datatypes: expected - got CLOB错误&#xff0c;这个错误很明显是由于查询时类型的不匹配造成的。 问题分析&#xff1a; 一、检查你的查询的实体的类型是否于数据库的保持一致&#xff0c;如果不一致&#xff0c;那么需…

Rumor Remove Order Strategy on Social Networks

ABSTRACT 谣言被定义为广泛传播且没有可靠来源支持的言论。现代社会&#xff0c;谣言在社交网络上广泛传播。谣言的传播给社会带来了巨大的挑战。 “假新闻”故事可能会激怒您的情绪并改变您的情绪。有些谣言甚至会造成社会恐慌和经济损失。因此&#xff0c;谣言的影响可能是深…

Redis-数据过期策略

文章目录 Redis数据持久化策略的作用是什么&#xff1f;Redis的数据过期策略有哪些&#xff1f;惰性删除定期删除 更多相关内容可查看 Redis数据持久化策略的作用是什么&#xff1f; Redis数据过期策略是指在Redis中设置数据的过期时间&#xff0c;并在数据过期时自动从数据库…

【JavaScript超详细的学习笔记-上】JavaScrip超详细的学习笔记,共27部分,12多万字

想要获取笔记的可以点击下面链接获取 JavaScript超详细的学习笔记&#xff0c;点击我获取 一&#xff0c;JavaScript详细笔记 1&#xff0c;基础知识 1-1 基础知识 // 1&#xff0c;标识符命名规则&#xff1a;第一个字母必须是字母&#xff0c;下划线或一个美元符号。不能…

pasmutility.dll丢失要怎么修复,pasmutility.dll破解补丁在哪里找到?

pasmutility.dll是电脑中非常重要的文件之一&#xff0c;当电脑突然弹出“找不到pasmutility.dll”或是“pasmutility.dll丢失”等的错误提示窗口&#xff0c;可以选择下载pasmutility.dll文件&#xff0c;当然除了下载的方法还有很多种关于pasmutility.dll丢失的解决方法&…

自作聪明的AI? —— 信息处理和传递误区

一、背景 在人与人的信息传递中有一个重要问题——由于传递人主观处理不当&#xff0c;导致信息失真或产生误导。在沟通交流中&#xff0c;确实存在“自作聪明”的现象&#xff0c;即传递人在转述或解释信息时&#xff0c;根据自己对信息的理解、经验以及个人意图进行了过多的…

LeetCode 125题:验证回文串

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

Apache访问控制与虚拟主机

目录 一. Web服务简介 以下是一些 Web 服务的基本概念和特征 以下是一些主流的 Web 服务器 WEB 服务协议 二. Apache 服务的搭建与配置 2.1 Apache 介绍 2.2 Apache安装 2.3 Apache目录介绍 三. 访问控制 四. 修改默认网站发布目录 五. 虚拟主机 5.1 基于域名的虚拟…

Linux信息显示相关指令

1、查看cpu 查看cpu信息:cat /proc/cpuinfo 查看cpu个数:nproc cat /proc/cpuinfo | grep "physical id" | uniq | wc -l uniq命令:删除重复行;wc –l命令:统计行数 查看CPU核数 cat /proc/cpuinfo | grep "cpu cores" | uniq 2、查看内存 cat /pr…

【STM32 |程序实例】按键控制、光敏传感器控制蜂鸣器

目录 前言 按键控制LED 光敏传感器控制蜂鸣器 前言 上拉输入&#xff1a;若GPIO引脚配置为上拉输入模式&#xff0c;在默认情况下&#xff08;GPIO引脚无输入&#xff09;&#xff0c;读取的GPIO引脚数据为1&#xff0c;即高电平。 下拉输入&#xff1a;若GPIO引脚配置为下…

Android adb shell关于CPU核的命令

Android adb shell关于CPU核的命令 先使用命令&#xff1a; adb shell 进入控制台。 然后&#xff0c;直接在$后面输入下面命令&#xff0c;针对CPU的命令。 cat /proc/cpuinfo | grep ^processor | wc -l 查看当前手机的CPU是几核的。 cat sys/devices/system/cpu/online …

Ansible常用变量【下】

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 前言 在上一篇文章《Ansible常用变量【上】》中&#xff0c;学习了Ansible常用变量的前半部分&#xff0c;放了个五一假&#x…

LeetCode1207独一无二的出现次数

题目描述 给你一个整数数组 arr&#xff0c;请你帮忙统计数组中每个数的出现次数。如果每个数的出现次数都是独一无二的&#xff0c;就返回 true&#xff1b;否则返回 false。 解析 正常的解法肯定是对每个元素使用一个hashmap&#xff0c;存元素及出现次数&#xff0c;然后通…