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


被观察者和观察者都用了接口实现,是不是很方便!!! 欢迎喜欢java技术的同学加我微信dongping8887,互相交流。


1 0
原创粉丝点击