Rx系列二 | Observer | Observable

来源:互联网 发布:关键词外包优化 编辑:程序博客网 时间:2024/04/28 17:52

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

1 0
原创粉丝点击