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. Python系列之 - 描述符

    描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议 __get__():调用一个属性时,触 ...

  2. 前端之旅HTML与CSS篇之block与inline的区别

    display:block;和display:inline;的区别block元素特点: 1)处于常规流中时,如果width没有设置,会自动填充满父容器 2)可以应用margin/padding 3)在 ...

  3. 前端面试送命题-JS三座大山

    前言 本篇文章比较适合3年以上的前端工作者,JS三座大山分别指:原型与原型链,作用域及闭包,异步和单线程. 原型与原型链 说到原型,就不得不提一下构造函数,首先我们看下面一个简单的例子: functi ...

  4. C# 获取字符串中的英文字母

    string str20 = "ABC123"; string strSplit1,strSplit2; //取出字符串中所有的英文字母 strSplit1 = Regex.Rep ...

  5. js保留整数

    1.丢弃小数部分,保留整数部分parseInt(5/2) 2.向上取整,有小数就整数部分加1 Math.ceil(5/2) 3,四舍五入. Math.round(5/2) 4,向下取整 Math.fl ...

  6. [HAOI 2008]木棍分割

    Description 题库链接 有 \(n\) 根木棍,第 \(i\) 根木棍的长度为 \(L_i\) , \(n\) 根木棍依次连结了一起,总共有 \(n-1\) 个连接处.现在允许你最多砍断 \ ...

  7. [SDOI2008]Cave 洞穴勘测

    题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假 ...

  8. [BZOJ]2589: Spoj 10707 Count on a tree II

    Time Limit: 20 Sec  Memory Limit: 400 MB Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v),你需要回答u xor last ...

  9. poj 1873 凸包+枚举

    The Fortified Forest Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6198   Accepted: 1 ...

  10. [HEOI 2016] seq

    题解: 发现多决策且明显无后效性,果断dp,那么转移方程F[i]=F[j]+1 设R[I]为改变之后的最大值,L[i]为改变之后的最小值 由于只能改变一个元素 所以转移的条件是 (j<i &am ...