Reactive Extensions 初识
目录:
简介
示例
结论
在.NET 4.0中多了一个IObservable和IObserver接口。用MSDN的话说是:基于推送的通知的提供程序。相当拗口。个人理解就是属性发生变化时,订阅该属性的方法得到通知。就是观察者模式的定义。
示例:
现在有A和B。他们输入值后得到C。只要A和B有一个输入,C就会发生变化。
我用观察者模式来写 A输入了值。C发生了变化:
public enum Bit{Low = 0,High = 1}public interface IInput{void SetValue(Bit bit);}public interface IGate{void Register(IInput input);
// void UnRegister(IInput input);}public class Gate : IGate{private static Hashtable _container = new Hashtable();public void Register(IInput input){_container.Add(input, input);}protected void NotifyProperty(Bit bit){foreach (IInput item in _container.Keys){item.SetValue(bit);}}}public class ObserverC:IInput{public void SetValue(Bit bit){Console.WriteLine(bit);}}public class ObserverA : Gate{private string _name;public string Name{get { return _name; }set { _name = value;base.NotifyProperty(Bit.Low); }}}
在Main()中调用
ObserverA a=new ObserverA();
ObserverC c = new ObserverC();
Gate gate= new Gate();
gate.Register(c);
a.Name="hello";
结果输出 Low;
那用IObservable来写会简化很多,这时需要引入System.Reactive.dll
public class Input{private Subject<Bit> valueStream = new Subject<Bit>();public IObservable<Bit> Value { get { return valueStream; } }public void SetValue(Bit value){valueStream.OnNext(value);}}public class Gate{private IObservable<Bit> _subject;public Gate(IObservable<Bit> x, IObservable<Bit> y){_subject = x.CombineLatest(y, Calculate);}protected virtual Bit Calculate(Bit arg1, Bit arg2){return Bit.Low;}public IObservable<Bit> Value { get { return _subject; } }}public enum Bit{Low = 0,High = 1}public class AndGate : Gate{public AndGate(IObservable<Bit> x, IObservable<Bit> y): base(x, y){ }protected override Bit Calculate(Bit arg1, Bit arg2){return (arg1 == Bit.High && arg2 == Bit.High) ? Bit.High : Bit.Low;}}
在Main中:
Input a1 = new Input();
Input a2 = new Input();
AndGate andGate = new AndGate(a1.Value, a2.Value);
andGate.Value.Subscribe(x => Console.WriteLine(x));
a1.SetValue(Bit.High);
a2.SetValue(Bit.High);
结果:High
结论:IObservable demo中Subject类似于观察者模式demo中Hashtable。Subscrible类似于NotifyProperty方法。
转载于:https://www.cnblogs.com/dingli/archive/2012/06/07/2540928.html
Reactive Extensions 初识相关推荐
- Reactive Extensions(Rx) 学习
Bruce Eckel(著有多部编程书籍)和Jonas Boner(Akka的缔造者和Typesafe的CTO)发表了"反应性宣言",在其中尝试着定义什么是反应性应用. 这样的应用 ...
- Resources about Rx(Reactive Extensions)
为什么80%的码农都做不了架构师?>>> http://msdn.microsoft.com/en-us/library/hh242985(v=VS.103).aspx htt ...
- 2、Reactive Extensions for .NET(译)
本文转自:http://www.cnblogs.com/hebeiDGL/p/3405175.html 实验3-引入 .net 中的 events 到 Rx 目标:前面实验中的使用各种工厂构造方法创建 ...
- Reactive Extensions简介一
在.Net 4.0中引入了两个新的接口用来实现观察者模式--IObservable和IObserver.IObservable是数据源,IObserver是观察者,观察者订阅数据源后,当新的数据产生时 ...
- Reactive Extensions for .NET (Rx)
LINQ to Object使用IEnumerable和IEnumerator两个接口来迭代数据集.枚举器的MoveNext()方法用于从前一个元素枚举到下一个元素,而Current属性则用于检索个别 ...
- 微软开源Reactive Extensions
Reactive Extensions (Rx)已经由Microsoft Open Technologies开源.这增加了它不久之后出现在Mono中的可能性. Rx是一个函数库,让人们可以利用可观察序 ...
- Reactive Extensions 相见恨晚的Rx.Net
何为Reactive Extensions(Rx) Rx是一个遵循函数式编程的类库,它引用观察者以及迭代器设计模式对可观察对象产生的数据进行异步消费.使用Rx,开发人员将使用LINQ运算符操作异步数据 ...
- 牛刀小试:使用Reactive Extensions(Rx),对短时间内多次发生的事件限流
我之前有一篇文章介绍到了Reactive Extension这个组件,请参考下面的文章,其中有一些基本的概念和相关的链接 牛刀小试:使用Reactive Extensions(Rx),一行代码实现多线 ...
- Reactive Extensions入门(4):Rx实战
Reactive Extensions(Rx)的优点在于能够将传统的异步编程方式从支离破碎的代码调用中解放出来.传统的采用回调的异步编程方式会使得代码很零散,尤其是异步嵌套异步的时候,代码块很难管理. ...
- MVVM模式与Reactive Extensions 学习与思考
MVVM来历:John Gossman 于2005写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expression Blend(即'Spark ...
最新文章
- java 类定义_JAVA类与对象(二)----类定义基础
- 一个 P4 的 Bug,就难倒了 JDK 吗 ?
- linux c dup dup2 重定向函数简介
- php中堆和栈的使用
- centos6.4修改网卡名
- linux技巧----查找某个正在执行的脚本
- mysql数据库二进制_Mysql数据库简单安装(二进制)
- jQuery学习之---效果
- 用LoadRunner实现接口测试
- 《程序是怎样跑起来的》第七章
- Visual Studio 2015 专业版安装方法
- android 动态截图软件,点点GIF(动态图片制作工具)
- 暑期作息时间表模板_小学生暑假作息时间表模板范例
- 相机参数(焦距)初始化对三维重建过程的影响
- 注册gmail账号,手机无法接受验证码的问题
- 使用TeamViewer远程连接Android手机并控制
- c/c++实现五子棋
- 每周一磁 · 矫顽力Hcb和内禀矫顽力Hcj
- wifi卡慢延迟高_WiFi明明信号满格,为何又卡又慢,问题在这里!
- SXOI2018 游记
热门文章
- 拓端tecdat|R语言结合新冠疫情COVID-19对股票价格预测:ARIMA,KNN和神经网络时间序列分析
- class文件如何在linux下打开_Linux下文件的三个时间属性
- slice indices must be integers or None or have an __index__ method
- (22)Python-builtins-sorted()函数用法
- spring教程笔记3
- 感知器分类模型回顾与python实现
- pygame系列文章
- Sina微博模拟登录获取Cookies
- Tf-idf推导及理解
- 剑指offer答案python_剑指offer(python)(未完)