Rx系列二 | Observer | Observable


上节课我们对RX的一些基本概念和使用JAVA代码实现了一个观察者,但是这只是对思路的一个讲解,在我们JAVA中,其实是已经封装好了观察者对象的,就是Observer和Observable,因为RxJava和RxAndoird都会比较依赖这个,所以我们先把原生的讲解一下,那我们再模拟一次观察和被观察,我先写一个

Observable

import java.util.Observable;

/*
 *项目名: RxSample
 *包名:   com.liuguilin.rxsample.observable
 *文件名:  ObServableTest
 *创建者:  LGL
 *创建时间:2016/12/3111:13
 *描述:    被观察者
 */
public class ObServableTest extends Observable {

    private int data = 0;

    public int getData() {
        return data;
    }

    public void setData(int data) {
        if(this.data != data){
            this.data = data;
            //发生改变,update方法调用
            setChanged();
            //通知观察者
            notifyObservers();
        }
    }
}

我们仔细来看这段被观察者的代码,我定义了一个data的变量,并且实现了他的set/get方法,不过我在他的set方法里做了调整,当你当前的data和set进来的数据不相同的时候,我就调用setChanged这个方法,同时通过notifyObservers方法来通知观察者,观察者就会调用update的方法,那我们来看一下观察者都做了什么

Observer

import java.util.Observable;
import java.util.Observer;

/*
 *项目名: RxSample
 *包名:   com.liuguilin.rxsample.observable
 *文件名:  ObserverTest
 *创建者:  LGL
 *创建时间:2016/12/3111:18
 *描述:    观察者
 */
public class ObserverTest implements Observer {

    public ObserverTest(ObServableTest obServableTest) {
        //监听
        obServableTest.addObserver(this);
    }

    @Override
    public void update(Observable o, Object arg) {
        System.out.print("data is changed:" + ((ObServableTest)o).getData() + "\n");
    }
}

观察者这里实现了Observer,然后他的构造方法里会传递一个被观察者,通过obServableTest.addObserver(this);的方法将观察者和被观察者订阅在一起,并且重写了update方法,我们的思路就是这样,我们现在实现一个Test类

Test

/*
 *项目名: RxSample
 *包名:   com.liuguilin.rxsample.observable
 *文件名:  Test
 *创建者:  LGL
 *创建时间:2016/12/3111:22
 *描述:    测试
 */
public class Test {

    public static void main(String [] args){
        //被观察者
        ObServableTest obServableTest = new ObServableTest();
        //观察者
        ObserverTest observerTest = new ObserverTest(obServableTest);

        obServableTest.setData(1);
        obServableTest.setData(2);
        obServableTest.setData(2);
        obServableTest.setData(3);

    }
}

在测试类中,我们实现了观察者和被观察者的订阅,同时,开始setdata,你细心的话,会发现,当setdata(1)的时候,实际上默认为0,所以状态改变了,会输出的,然后这个data就是1了,你再setdata(2),也会改变,现在默认就是2了,你再调用setdata(2)就不会触发update了,以此类推,实际上,会调用三次,那到底对不对呢,我们看一下输出

恩 没错,就是这样,是不是很简单,到这里,我相信你对一个基本的观察和订阅有了一个简单的认识,但是这个只是简单的演示,实际上只是让你有一个思想准备而已,别急,我们下篇上正餐!

Sample下载:系列最后一篇提供

系好安全带,上车了:555974449

Rx系列二 | Observer | Observable的更多相关文章

  1. RX系列四 | RxAndroid | 加载图片 | 提交表单

    RX系列四 | RxAndroid | 加载图片 | 提交表单 说实话,学RxJava就是为了我们在Android中运用的更加顺手一点,也就是RxAndroid,我们还是先一步步来,学会怎么去用的比较 ...

  2. RX系列一 | ReactiveX根源 | 观察者模式分析

    RX系列一 | ReactiveX根源 | 观察者模式分析 Rx的响应式编程算是很火了,对吧,但是我的工作基本上就不会接触,所以学习的比较晚,到现在才分享给大家,我们一点点的去学,当你看完这整个系列的 ...

  3. Rx系列---响应式编程

    Rx是ReactiveX的简称,翻译过来就是响应式编程 首先要先理清这么一个问题:Rxjava和我们平时写的程序有什么不同.相信稍微对Rxjava有点认知的朋友都会深深感受到用这种方式写的程序和我们一 ...

  4. RX系列三 | RxJava | create | from | interval | just | range | filter

    RX系列三 | RxJava | create | from | interval | just | range | filter 我们在第一篇里有说过一些基本的关系,现在我们需要用到一些依赖,这里记 ...

  5. RxSwiftライブラリの作り方 〜Observer/Observable編〜

    RxSwiftライブラリの作り方をご紹介します.一つの記事ですべてを説明するのは非常に厳しいので.まず Observer や Observable といった基本的なコンポーネントとその周辺について.ひ ...

  6. 手牵手,从零学习Vue源码 系列二(变化侦测篇)

    系列文章: 手牵手,从零学习Vue源码 系列一(前言-目录篇) 手牵手,从零学习Vue源码 系列二(变化侦测篇) 陆续更新中... 预计八月中旬更新完毕. 1 概述 Vue最大的特点之一就是数据驱动视 ...

  7. 前端构建大法 Gulp 系列 (二):为什么选择gulp

    系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...

  8. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

  9. Web 开发人员和设计师必读文章推荐【系列二十九】

    <Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

随机推荐

  1. 卷积神经网络的一些经典网络(Lenet,AlexNet,VGG16,ResNet)

    LeNet – 5网络 网络结构为: 输入图像是:32x32x1的灰度图像 卷积核:5x5,stride=1 得到Conv1:28x28x6 池化层:2x2,stride=2 (池化之后再经过激活函数 ...

  2. canvas绘制圆心扇形可组成颜色随机的七色小花

    啊~现在应该还是春天吧.心情一如既往的烦闷呐.最近做了一个canvas的扇形绘制的东西.把它整理出来变成一个适合春天的花朵绘制~沉闷的工作环境已经让我这种有趣的人也变成了无聊鬼怪呢.下次一定想找一个年 ...

  3. java中的数组概念

    数组的定义形式: 动态初始化方式: 1.声明并开辟数组 String str[]=new String[3];//3表示数组的长度 2.分布完成 String str[]=null; str=new ...

  4. [LeetCode] Minimum Genetic Mutation 最小基因变化

    A gene string can be represented by an 8-character long string, with choices from "A", &qu ...

  5. zabbix利用orabbix监控oracle

    Orabbix 是一个用来监控 Oracle 数据库实例的 Zabbix 插件.(插件安装在zabbix-server端) 下载地址:http://www.smartmarmot.com/produc ...

  6. codefroces 946G Almost Increasing Array

    Description给你一个长度为$n$的序列$A$.现在准许你删除任意一个数,删除之后需要修改最小的次数使序列单调递增.问最小次数.$1≤n≤200000$ExamplesInput55 4 3 ...

  7. codeforces 868B Race Against Time

    Have you ever tried to explain to the coordinator, why it is eight hours to the contest and not a si ...

  8. C++Primer学习——函数

    编译器能以任意顺序对形参进行求值 函数的返回类型不能是数组类型和函数类型. 函数开始时为形参分配内存,一旦函数结束,形参也就被销毁了. 如果弄成静态局部变量,那么回到程序终止结束时才被销毁. void ...

  9. 2015 多校联赛 ——HDU5302(矩阵快速幂)

    The Goddess Of The Moon Sample Input 2 10 50 12 1213 1212 1313231 12312413 12312 4123 1231 3 131 5 5 ...

  10. Orz

    OR: 说实话,感觉Virtual Judge挺好使的,至少到现在,Uva都没注册成功过QAQ,估计是校园网的问题 不得不说现在课越来越多,而且对于我们这种学校ACM才开展两年的来说,时间真的好有限, ...