java观察者模式不一样的使用
来源:互联网 发布:centos查看php版本 编辑:程序博客网 时间:2024/05/20 21:18
在java8出现之前,我们使用JDK中的观察者模式,只能是使用被观察者类继承自Observable类,观察者类实现Observer接口来实现。对这一部分不熟悉的同学,请参考
http://blog.csdn.net/JenMin_blog/article/details/45012341?locationNum=11&fps=1。
这样子使用是没有什么问题的,但是并不完美。如果业务复杂,我们的被观察者还需要继承别的类,而java中是没有多继承的。这时,我们将陷入两难,不知如何抉择。
幸好,我们的java8对接口的定义做了很大的改变,使得我们能有机会填补上面的遗憾。在java中所有的类只能是单继承的,但是类可以实现多个不同的接口。我们的想法就是将被观察者的父类Observable封装进接口中来达到这一目的。直接上代码~
//ObservableInterface.java
package dp.observable;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Observable;import java.util.Observer;/** * 观察者模式接口 * * @author dongp * */public interface ObservableInterface {/** * 获取单一的被观察者 * * @return */public Observable getSingleObservable();default void addObserver(Observer o) {getSingleObservable().addObserver(o);}default void deleteObserver(Observer o) {getSingleObservable().deleteObserver(o);}default void notifyObservers() {setChanged();getSingleObservable().notifyObservers();}default void notifyObservers(Object arg) {setChanged();getSingleObservable().notifyObservers(arg);}default void deleteObservers() {getSingleObservable().deleteObservers();}default void setChanged() {try {Method method = Observable.class.getDeclaredMethod("setChanged", new Class[] {});method.setAccessible(true);method.invoke(getSingleObservable(), new Object[] {});} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {e.printStackTrace();}}}
在上面的这个接口中封装类被观察者类。
//Observer1.java
package dp.observable;import java.util.Observable;import java.util.Observer;/** * 观察者 * * @author dongp * */public class Observer1 implements Observer { public Observer1() {TestObservable.testObservable.addObserver(this); } @Override public void update(Observable o, Object arg) {System.out.println("i'm Obverser1: " + o); }}这是实现了观察者接口的对象的类。
//TestObservable.java
package dp.observable;public class TestObservable extends Object implements ObservableInterface { public static TestObservable testObservable = new TestObservable(); Observable observable = new Observable(); public static void main(String[] args) {new Observer1();new Observer2();new Observer3();testObservable.notifyObservers(); } @Override public Observable getSingleObservable() {return observable; }}这是实现了被观察者接口的对象的类,带测试。
Observer2、和Observer3和Observer1是一样的,只是类名和输出部分一点点不同。
//运行结果。
i'm Obverser3: java.util.Observable@6d06d69ci'm Obverser2: java.util.Observable@6d06d69ci'm Obverser1: java.util.Observable@6d06d69c
1 0
- java观察者模式不一样的使用
- Java内置的观察者模式的使用
- Java中观察者模式的使用(二)
- Java 中观察者模式的使用
- java中观察者模式的使用场景
- 观察者模式的使用
- 观察者模式的使用
- 观察者模式的使用
- java的观察者模式
- java的观察者模式
- java观察者模式-使用java观察者模式的支持
- Java设计模式2:观察者模式2(使用java内置的观察者)
- java不一样的单例模式
- Java 语言使用 Observer/Observable 实现简单的观察者模式
- 使用java提供的Observable,实现观察者模式
- 在Java中简单的使用观察者模式
- NSNotificationCenter(观察者模式) 的使用
- 观察者模式的熟练使用
- 4. Median of Two Sorted Arrays
- 5-13 是否完全二叉搜索树 (30分)
- coder初入职场必备:Eclipse+Tomcat8+MAVEN+SVN 工作环境搭建
- Android Device Monitor 文件管理的常见问题
- Canvas学习
- java观察者模式不一样的使用
- Java知识点小总结(一)
- Service和IntentService与Acticity之间的通信
- nyistOJ-石子合并(一)(区间DP)
- jsonp跨域的简单实现
- java ExecutorService
- C语言实现单链表以及链表对应的面试题
- Call to undefined function mcrypt_module_open()
- 模拟实现memmove