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

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

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

相关文章

大模型时代下两种few shot高效文本分类方法

介绍近年(2022、2024)大语言模型盛行下的两篇文本分类相关的论文&#xff0c;适用场景为few shot。两种方法分别是setfit和fastfit&#xff0c;都提供了python的包使用方便。 论文1&#xff1a;Efficient Few-Shot Learning Without Prompts 题目&#xff1a;无需提示的高效少…

C语言——模拟实现库函数atoi

1. atoi atoi&#xff1a;将字符串转换为整数。 1. 头文件 <string.h> 2. 声明&#xff1a; 1. 如果字符串开始有空格&#xff0c;直接跳过。 2. - 会影响打印的数字的正负。 3. 只打印数字字符&#xff0c;遇到非数字字符就停止。 4. 如果转换之后的数字大于 …

开眼了,自动化测试还能这样用?

持续集成的自动化测试通常需要将代码、测试用例与持续集成工具进行绑定&#xff0c;以实现自动运行。然而&#xff0c;Apipost的自动化测试功能需要手动操作&#xff0c;并且需要手动查看测试结果。 为了解决这个问题&#xff0c;Apipost推出了持续集成功能&#xff0c;方便同…

2025考研 | 北京师范大学计算机考研考情分析

北京师范大学&#xff08;Beijing Normal University&#xff09;简称“北师大”&#xff0c;由中华人民共和国教育部直属&#xff0c;中央直管副部级建制&#xff0c;位列“211工程”、“985工程”&#xff0c;入选国家“双一流”、“珠峰计划”、“2011计划”、“111计划”、…

从“金事通”带给我意想不到的来说--“数据是架构的中心”

背景 上周一个保险的销售人员来找我完成一定的售后流程。其中有一项是请我下载一个叫 金事通的 APP。说实在的我根本没听过。她说这是政治任务。我想不是有你们保险公司的APP了嘛。为什么还要我安装。没办法先安装吧。 经历了注册、人脸识别的步骤后。可以登录了。注册短信发…

【异常处理】(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 求一元二次方程式ax^2bxc0的实根&#xff0c;如果方程没有实根&#xff0c;则输入有关警告信息。要求&#xff1a;建立一元二次方程类&#xff0c;利用异常技术处理。 源码 #include <iostream> #include <cmath>using namespa…

iOS MRC那句话

混编时使用MRC文件需要使用这句话 -fno-objc-arc在下图中显示的位置添加

【Android Studio】开启真机调试

1 打开手机的开发者模式 各种款式的手机进入开发者模式的情况不同&#xff0c;但大致是在 【关于手机】中多次点击系统版本即可进入。这里以小米8为例&#xff0c;记录下流程。 1.1 进入手机开发者模式 【设置】->【我的设备】->【全部参数】->【MIUI版本】连续点击3…

防火请技术基础篇:令牌桶机制的剖析与应用

防火墙中的令牌桶机制&#xff1a;深度剖析与应用 在现代网络通信中&#xff0c;防火墙技术发挥着至关重要的作用&#xff0c;它不仅能够实现网络安全防御&#xff0c;还能通过诸如令牌桶算法等机制来有效管理网络流量&#xff0c;保证网络服务的质量。本文将全面深入地探讨防…

[猫头虎分享21天微信小程序基础入门教程]第8天:发布与审核流程

第8天&#xff1a;发布与审核流程 &#x1f680; 自我介绍 大家好&#xff0c;我是猫头虎&#xff0c;一名全栈软件工程师。今天我们将继续微信小程序的学习&#xff0c;重点了解如何将开发完成的小程序提交审核并发布上线。这是小程序从开发到用户使用的关键步骤。&#x1f…

通过EXCEL控制PLC启停电机的一种方法

概述 本例将介绍用微软EXCEL电子表格控制西门子S7-1200 PLC实现电机启停的一种方法。 第1步&#xff1a; 添加PLC设备&#xff0c;选择西门子S7-1214C CPU&#xff0c;设置IP地址&#xff1a;192.168.18.18&#xff0c;子网掩码&#xff1a;255.255.255.0。 第2步&#xff1a…

【新手入门】Github与Git使用教程

Github与Git 一、Github基础教程 1.1 基本操作 点击代码文件可以直接查看文件的内容&#xff0c;支持在线修改文件&#xff0c;只需要点击(文件内容)右上角的编辑按钮即可进行编辑。 README.md一般介绍项目的功能&#xff0c;用法&#xff0c;注意事项&#xff1b;有时还有…