为什么要这么做?

在教你写响应式框架(三)中,我们还留有一个问题没有说明:为什么OperatorMap中的泛型和Operator中泛型参数的位置正好是相反的?

Operator本身是对Observable发射的数据进行转换的,因此往往出现operator转换之后返回的数据类型发生变化,这时候将泛型参数颠倒一下,就可以保证call方法返回的Observer能够订阅Observable发射出的数据。举个例子来说明:

 Observable<Integer> observable = Observable.create(new Observable.OnAttach<String>() {@Overridepublic void call(Observer<? super String> observer) {observer.update("1");}}).map(new IFun<String, Integer>() {@Overridepublic Integer call(String s) {return Integer.valueOf(s);}});observable.attach(new Observer<Integer>() {@Overridepublic void update(Integer aFloat) {System.out.println(aFloat);}});

在上面的代码中,map操作符的操作参数为IFun<String,Integer>,而为了使map操作产生的Observer能够订阅create()方法产生的Observable,这时的OperatorMap中的call方法需要产生Observer<String>类型的对象,这使你会发现简单的泛型参数对掉就可以轻松的解决了这个问题。这是来看一下OperatorMap中的call方法:

  public Observer<? super T> call(Observer<? super R> observer) {return new Observer<T>() {@Overridepublic void update(T t) {observer.update(convert.call(t));}};}

到现在为止,我们已经解决的一些问题,接下来,我们就来看看如何扩展这个小框架。


扩展,增强现有功能

现在我想要为框架增添过滤操作,该怎么做呢?考虑该操作会只过滤掉不满足条件的元素,而不会改变元素类型,因此我们如下设计该类:

public class OperatorFilter<T> implements Observable.Operator<T, T> {private IFun<? super T, Boolean> fun;public OperatorFilter(IFun<? super T, Boolean> fun) {this.fun = fun;}@Overridepublic Observer<? super T> call(Observer<? super T> observer) {return new Observer<T>() {@Overridepublic void update(T t) {if (fun.call(t).booleanValue()) {observer.update(t);}}};}
}

随后,我们在Observable添加函数:

public <R> Observable<R> filter(IFun<? super T, Boolean> fun) {return lift(new OperatorFilter(fun));}

准备工作已经完成,让我们测试一下:

public class Client {public static void main(String[] args) {Observable.create(new Observable.OnAttach<Integer>() {@Overridepublic void call(Observer<? super Integer> observer) {for (int i = 0; i < 10; i++) {observer.update(new Random().nextInt(10));}}}).filter(integer -> integer > 5).map(integer -> "num:" + integer).attach(integer -> System.out.println(integer));}}

运行结果为:

num:8
num:6
num:6
num:9

到现在为止,我们构建出了框架的基本主干,并支持了map和filter操作,尽管它看起来有点low,但本教程的目的更倾向于传递一种响应式编程的理念,让每个人都能理解,拉低响应式框架开发的门槛。

好吧,最后给它起了个牛逼的名字叫做”ErJava”,就是easy Reactive Java的意思。


总结

这四个章节一步一步教你如何设计和改进既有的结构,你发现整个框架从最基础的观察者模式出发,在我们不断的提问中得到演进。这与其他框架的开发流程并没有太大的区别,实际上大部分框架的开发工作在之前都会做一个雏形的设计,随着后面的发展才慢慢得到改善,这正如我们所做的一样。

除此之外,你会发现我们尽可能的遵从OOD的设计理念,当然,一些经验性的设计方法也起了很大的作用。

教你写响应式框架(四)相关推荐

  1. 教你写响应式框架(三)

    还要做什么? 在教你写响应式框架(二)中,我们对原始代码进行了初步的改造,如果没看过上篇的可以先看一下.那么在今天我们仍然是在原有项目的基础上进行改造,在改造之前,我们想先提出两个目标: 增加map操 ...

  2. 教你写响应式框架(二)

    还要做什么? 在教你写响应式框架(一)中我们介绍了观察者模式,现在我们将基于上一篇中的代码进行改造.当然,我们是有目的的改造: 在响应式框架中,观察者是可能随时产生,种类多,生命周期却短暂. 我们希望 ...

  3. 教你写响应式框架(一)

    在真正开始编写自己的响应式框架之前,我们先来从观察者模式说起.已经对观察者模式很熟悉的可以直接掠过. 基本概念 观察者模式属于对象行为模式之一,也可叫做发布--订阅模式.它定义了一种以对多的依赖关系, ...

  4. 模仿vue自己动手写响应式框架( - v-for

    https://segmentfault.com/a/1190000023338872

  5. easyui前端框架模板_.NET Core基于Ace Admin的响应式框架

    (给DotNet加星标,提升.Net技能) 转自:netnrcnblogs.com/netnr/p/12020660.html 前言 .NET Core的响应式框架 基于Ace Admin框架菜单导航 ...

  6. html响应式布局 ace,.NET Core基于Ace Admin的响应式框架

    原标题:.NET Core基于Ace Admin的响应式框架 转自:netnr cnblogs.com/netnr/p/12020660.html 前言 .NET Core的响应式框架 基于Ace A ...

  7. 美团客户端响应式框架 EasyReact 开源啦

    前言 EasyReact 是一款基于响应式编程范式的客户端开发框架,开发者可以使用此框架轻松地解决客户端的异步问题. 目前 EasyReact 已在美团和大众点评客户端的部分业务中实践,并且持续迭代了 ...

  8. [转]异步编程与响应式框架

    作者:老赵 来源:http://blog.zhaojie.me/2010/09/async-programming-and-reactive-framework.html 前言 异步操作是强大的,它是 ...

  9. 响应式框架简单知识介绍

    响应式框架英文 respond layout意在实现不同屏幕分辨率的终端上浏览网页的不同展示方式.通过响应式设计能使网站在手机和平板电脑上有更好的浏览阅读体验. 一.出现的背景 在移动互联日益成熟的时 ...

最新文章

  1. Lucene默认的打分算法——ES默认
  2. es6 语法 (Proxy和Reflect 的对比)
  3. 趴在门口的云计算,盯上了屋内狂奔的CDN
  4. java单词按字典排序_最终Java日志字典:开发人员最常记录的单词是什么?
  5. 小米9京东预约破百万!明日正式首销:售价2999元起
  6. 现代通信技术之分组交换技术
  7. python chmod_使Python脚本可执行chmod755?
  8. iPhone防止系统自动下载更新
  9. 黑科技 未来人们可用身体这7个部位来控制设备
  10. node打印彩色文字
  11. python封包和解包_python解析网络封包方法
  12. 【xubuntu】 在xubuntu系统上开启自动登陆,并自动启动一个应用程序。
  13. MDT 2013 从入门到精通之Office 2013应答文件生成
  14. mysql进阶(三)31-43
  15. PHP支付宝当面付异步回调如何实现验签
  16. Scrum框架详解总结
  17. JS方法篇:vue.js判断滚动条触底
  18. CnOpenData中国专利IPC分类号数据(世界版)
  19. 关于Linux性能调优中磁盘IO调优的一些笔记
  20. html页面确认按钮浮动,html的浮动按钮

热门文章

  1. [附源码]java+ssm计算机毕业设计基于Windows的银行信贷管理系统lz8bp(源码+程序+数据库+部署)
  2. 单点登录,同域名下有和非同域名下的登录
  3. 2023年转行IT行业依旧是最优选择
  4. MySQL数据库主从复制与读写分离(图文详解!)
  5. 前端做CRM管理系统是做什么_企业部署crm客户管理系统的意义是什么?
  6. QML类型:Flickable
  7. 20160108--搜索查询
  8. 从零开始学习CocosBuilder(转自泰然论坛)
  9. Apr.6th.08 拜山
  10. 2020中国农业大学计科学硕考研经验分享