转载自:https://jingyan.baidu.com/article/d3b74d64ac3b6c1f77e609c1.html

方法/步骤

 
  1.  

    IObserver<T> 和 IObservable<T> 接口为基于推送的通知提供通用机制,也称为观察者设计模式。。 IObservable<T> 接口表示发送通知(提供程序)的类;IObserver<T> 接口表示接收通知(观察器)的类。 T 表示提供通知信息的类。 在某些基于推送的通知中,IObserver<T> 实现和 T 可以表示相同的类型。

  2.  

    该提供程序必须实现一个方法 Subscribe,指出某个观察器要接收基于推送的通知。 该方法的调用方传递观察器的实例。 方法返回 IDisposable 实现,其可让观察程序在提供程序已停止发送它们的任意时间之前取消通知。

  3.  

    在任何给定时间,给定的提供程序可能具有零个、一个或多个观察器。 该提供程序负责存储对观察器的引用,并且在发送通知之前确保它们有效。 IObservable<T> 接口对于观察器的个数或发送通知的顺序不作任何假设。

    该提供程序通过调用 IObserver<T> 方法向观察器发送以下三种通知:

    【1】当前数据。 提供程序可以调用 IObserver<T>.OnNext 方法来为观察器传递包含当前数据、更改的数据或全新数据的 T 对象。

    【2】一个异常情况。 提供程序可以调用 IObserver<T>.OnError 方法来通知观察器出现了某种错误情况。

    【3】没有进一步的数据。 提供程序可以调用 IObserver<T>.OnCompleted 方法来通知观察器它已经完成通知的发送。

  4.  

    观察者设计模式使订阅者能够向提供程序注册并接收相关通知。 它适合所有需要推送通知的方案。 该模式定义一个提供程序(也称为主题或观察对象)以及零个、一个或多个观察者。 观察者向提供程序注册,并且当任何预定义的条件、事件或状态更改发生时,提供程序就会调用观察者中的一种方法,自动通知所有观察者。 在此方法调用中,提供程序还可以向观察者提供当前的状态信息。 在 .NET Framework 中,通过实现泛型 System.IObservable<T> 和 System.IObserver<T> 接口来应用观察者设计模式。 泛型类型参数表示提供通知信息的类型。

  5.  

    观察者设计模式适用于分布式推送通知,因为它支持两种不同的组件或应用程序层之间的绝对分离,例如数据源(业务逻辑)层和用户界面(显示)层。 每当提供程序使用回调向其客户端提供当前信息时,即可实现该模式。

    实现该模式需要您提供以下内容:

    提供程序或主体,即将通知发送给观察者的对象。 提供程序是一个实现 IObservable<T> 接口的类或结构。 提供程序必须实现一个方法 (IObservable<T>.Subscribe),希望接收提供程序通知的观察者会调用该方法。

    观察者,即接收提供程序通知的对象。 观察者是一个实现 IObserver<T> 接口的类或结构。 观察者必须实现三个方法,提供程序将调用所有这些方法:

    IObserver<T>.OnNext ,向观察者提供新信息或当前信息。

    IObserver<T>.OnError ,通知观察者发生错误。

    IObserver<T>.OnCompleted ,指示提供程序已完成通知发送。

    允许提供程序跟踪观察者的机制。 通常情况下,提供程序使用容器对象(例如 System.Collections.Generic.List<T> 对象)存放对已订阅通知的 IObserver<T>实现的引用。 因此目的而使用存储容器时,提供程序能够处理零到无限数量的观察者。 不定义观察者接收通知的顺序;提供程序可以自由选择任何方法来确定该顺序。

    允许提供程序在完成通知时移除观察者的 IDisposable 实现。 观察者从 Subscribe 方法接收对 IDisposable 实现的引用,所以它们还可以调用IDisposable.Dispose 方法以在提供程序完成通知发送之前取消订阅。

    包含提供程序向其观察者发送的数据的对象。 该对象的类型对应于 IObservable<T> 和 IObserver<T> 接口的泛型类型参数。 尽管该对象可以与IObservable<T> 实现相同,但在通常情况下,该对象为不同的类型。

IObservable 接口的更多相关文章

  1. C# IObservable与IObserver观察者模式

    C#中提供了IObservable<T>接口和IObserver<T>接口来实现观察者模式,IObservable<T>相当于Subject(主题)接口,下面我们就 ...

  2. 解构C#游戏框架uFrame兼谈游戏架构设计

    1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...

  3. External Configuration Store Pattern 外部配置存储模式

    Move configuration information out of the application deployment package to a centralized location. ...

  4. php五种常见的设计模式(转载)

    很多人都想着写博客来记录编程生活中的点滴,我也不例外,但想了好长时间不知道写什么........万事开头难,先转载一篇吧..... 设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Ga ...

  5. PHP中常见的五种设计模式

    设计模式只是为 Java架构师准备的 — 至少您可能一直这样认为.实际上,设计模式对于每个人都非常有用.如果这些工具不是 “架构太空人” 的专利,那么它们又是什么?为什么说它们在 PHP 应用程序中非 ...

  6. 【转】五种常见的 PHP 设计模式

    工厂模式 最初在设计模式 一书中,许多设计模式都鼓励使用松散耦合.要理解这个概念,让我们最好谈一下许多开发人员从事大型系统的艰苦历程.在更改一个代码片段时,就会发生问题,系统其他部分 —— 您曾认为完 ...

  7. 五种常见的 PHP 设计模式

    设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides Design(俗称 “四人帮”).所 ...

  8. C#游戏框架uFrame

    C#游戏框架uFrame兼谈游戏架构设计 c#语言规范 阅读目录 1.概览 2.基本概念 3.依赖注入 4.Manager of Managers 5.利用UniRX实现响应式编程 6.研究总结 回到 ...

  9. 在 .NET Core 中使用 DiagnosticSource 记录跟踪信息

    前言 最新一直在忙着项目上的事情,很久没有写博客了,在这里对关注我的粉丝们说声抱歉,后面我可能更多的分享我们在微服务落地的过程中的一些经验.那么今天给大家讲一下在 .NET Core 2 中引入的全新 ...

随机推荐

  1. qt: 打不开png图像以及opencv加载中文路径问题;

    经过亲测, QT(版本: 5.9.4)提供的QImageReader或者函数load在加载本地png图像时,均会提示失败, 按照网上的方法,将Qt plugins下的imageformats 拷贝到e ...

  2. Redis分布式锁----乐观锁的实现,以秒杀系统为例

    本文使用redis来实现乐观锁,并以秒杀系统为实例来讲解整个过程. 乐观锁      大多数是基于数据版本(version)的记录机制实现的.即为数据增加一个版本标识,在基于数据库表的版本解决方案中, ...

  3. 基于python调用libvirt API

    基于python调用libvirt API 1.程序代码 #!/usr/bin/python import libvirt import sys def createConnection(): con ...

  4. C函数调用

    目录 C函数调用 设置SP SP分析 区分NAND和NOR启动 参数调用 title: C函数调用 tags: ARM date: 2018-10-14 16:37:10 --- C函数调用 设置SP ...

  5. Scrapy框架的执行流程解析

    这里主要介绍七个大类Command->CrawlerProcess->Crawler->ExecutionEngine->sceduler另外还有两个类:Request和Htt ...

  6. 使用JMeter进行一次简单的带json数据的post请求测试,json可配置参数

    配置: 1.新建一个线程组: 然后设置线程数.运行时间.重复次数. 2.新建Http请求: 设置服务器域名,路径,方法,编码格式,数据内容. 可以在函数助手中,编辑所需要的变量,比如本例中的随机生成电 ...

  7. HDU 1024(新最大子序列和 DP)

    题意是要在一段数列中求 m 段互不重合的子数列的最大和. 动态规划,用数组 num[ ] 存储所给数列,建二维数组 dp[ ][ ] , dp[ i ][ j ] 表示当选择了第 j 个数字( num ...

  8. Django路由层

    路由层简单配置 urlpatterns = [ url(r'^admin/$', admin.site.urls), url(r'^articles/2003/$', views.special_ca ...

  9. sql parser

    最近在整理很多SQL代码, 需要分析出每个SQL的目标表和源表各有哪些, 网上没有找到工作具, 打算写个工具. Java调研结果:1. 商业组件包 sqlparser 有试用版组件, 限制SQL少于1 ...

  10. js动态修改Easyui元素不生效,EasyUI动态渲染解析解决方案

    easyui的渲染是在在网页加载完成后,相当于在$(document).ready()事件中,对整个网页进行了一次扫描,发现某个input标签含有easyui的属性,就在相应的地方进行ui的修改.因此 ...