看到foursquare下面用observable来实现对经纬度的刷新获取,特别记录observable学习(转载)
来源:互联网 发布:中朝关系恶化 知乎 编辑:程序博客网 时间:2024/05/17 09:45
Part I
JDK1.2后,Java提供了对观察者模式的支持接口和实现类。
其中接口 java.util.Observer 用来指定观察者,观察者必须实现 void update(Observable o, Object arg) 方法。
而 java.util.Observable 用来指定观察物(被观察者、可被观察的),并且提供了一系列的方法。读者可以很轻易的使用这个接口和实现类来实现观察者模式。
Part II
java.util.Observer 只有一个简单的方法 void update(Observable o, Object arg)
其中,参数 Observable o 用于指定触发 update 方法的对象, Object arg 用于指定触发 update 方法时候的附加参数。
如果有桌面应用开发的读者应该很了解,这跟事件处理机制是完全一样的,其中 Observable o 可被看作事件源。 Object arg 可被看作消息。
Part III
说了那么多,我们还是动手写个例子吧。这里我们以读者订阅杂志为例子。
package com.gzmu.observer.observable;import java.util.Observable;public class Publisher extends Observable {private String magazineName;public String getMagazineName() {return magazineName;}public void publish(String magazineName) {this.magazineName = magazineName;setChanged();notifyObservers(this);}}
package com.gzmu.observer.observer;import java.util.Observable;import java.util.Observer;import com.gzmu.observer.observable.Publisher;public class Reader implements Observer {@Overridepublic void update(Observable o, Object arg) {Publisher p = (Publisher) o;System.out.println("我要订阅" + p.getMagazineName());}}
package com.gzmu.observer.test;import org.junit.Test;import com.gzmu.observer.observable.Publisher;public class TestCase {@Testpublic void register() {Publisher publisher = new Publisher();publisher.publish("Kent.Kuan的技术空间");}}
这里很清楚的看到,当出版社出版杂志的时候,会主动的告知读者,读者就会订阅杂志,这也是一种主动推送的模式。
Part IV
这里大家会发现,调用 notifyObservers() 的时候,为什么传进当前对象 this 呢?而这个 this, 我们在读者那也没用到啊。这个问题曾经也让我觉得很苦恼,之前我也不清楚为什么观察者要拿到被观察对象的引用,但是,我们看看下面这个例子。
首先我们引用一个新的类:
package com.gzmu.observer.observable;import java.util.Observable;public class TVStation extends Observable {private String programmeName;public void play(String programmeName) {this.programmeName = programmeName;setChanged();notifyObservers(this);}public String getProgrammeName() {return programmeName;}}
然后修改Reader和TestCase:
package com.gzmu.observer.observer;import java.util.Observable;import java.util.Observer;import com.gzmu.observer.observable.Publisher;import com.gzmu.observer.observable.TVStation;public class Reader implements Observer {@Overridepublic void update(Observable o, Object arg) {if (o instanceof Publisher) {Publisher p = (Publisher) o;System.out.println("我要订阅" + p.getMagazineName());}if (o instanceof TVStation) {TVStation t = (TVStation) o;System.out.println("我要收看" + t.getProgrammeName());}}}
package com.gzmu.observer.test;import org.junit.Test;import com.gzmu.observer.observable.Publisher;import com.gzmu.observer.observable.TVStation;import com.gzmu.observer.observer.Reader;public class TestCase {@Testpublic void register() {Reader reader = new Reader();Publisher publisher = new Publisher();publisher.addObserver(reader);TVStation tvStation = new TVStation();tvStation.addObserver(reader);publisher.publish("Kent.Kwan的技术空间");tvStation.play("色戒");}}
最后我们可以看到,同一个观察者其实是可以注册到不同的被观察者上面的,而传过来的 Oberverable o 其实可以用来检验到底是谁发过来的消息。
除此以外,我们还可以在接受到消息之后,进行撤销观察的工作。
package com.gzmu.observer.observer;import java.util.Observable;import java.util.Observer;import com.gzmu.observer.observable.Publisher;import com.gzmu.observer.observable.TVStation;public class Reader implements Observer {@Overridepublic void update(Observable o, Object arg) {if (o instanceof Publisher) {Publisher p = (Publisher) o;p.deleteObserver(this);System.out.println("我要订阅" + p.getMagazineName());}if (o instanceof TVStation) {TVStation t = (TVStation) o;System.out.println("我要收看" + t.getProgrammeName());}}}
通过 deleteObserver() 方法就可以撤销观察出版社对象。
- 看到foursquare下面用observable来实现对经纬度的刷新获取,特别记录observable学习(转载)
- Observable
- Observable
- Observable
- observable
- compose: 对 Observable 整体的变换
- 基于Observer及Observable实现更易用的观察者模型
- Android观察者模式Observable的学习(一)
- .net下Observable Object的实现
- 用java.util.Observable实现Observer模式
- 用java.util.Observable实现Observer模式
- 将HystrixCommand通过Observable来实现响应式执行方式
- RxJS入门(2)---Observable的介绍
- Observable的操作符
- Observable.OnSubscribe 的理解
- RX操作符之对Observable发射的数据执行变换操作一(map、flatmap)
- Swift中实现Observable机制
- Angular学习:Subject和Observable
- zoj1365
- facebook与人人网的网站后台架构对比
- 去掉href中的下划线的方法
- android Criteria
- zoj 2297【DP+位运算状态压缩】
- 看到foursquare下面用observable来实现对经纬度的刷新获取,特别记录observable学习(转载)
- abap 字符串连接
- 问题:/bin/sh: can't access tty; job controlturned off 解决记录
- 修改内核启动logo的方法
- Android 重力感应SensorManager Demo
- 关于内存对其问题(一)
- Asp.Net_文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- 库函数和系统调用
- RGB,YUV420,图形码流