java 观察者模式 少用_java观察者模式不一样的使用

在java8出现之前,我们使用JDK中的观察者模式,只能是使用被观察者类继承自Observable类,观察者类实现Observer接口来实现。对这一部分不熟悉的同学,请参考

这样子使用是没有什么问题的,但是并不完美。如果业务复杂,我们的被观察者还需要继承别的类,而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 {

Observable observable = new Observable();

default void addObserver(Observer o) {

observable.addObserver(o);

}

default void deleteObserver(Observer o) {

observable.deleteObserver(o);

}

default void notifyObservers() {

setChanged();

observable.notifyObservers();

}

default void notifyObservers(Object arg) {

setChanged();

observable.notifyObservers(arg);

}

/**

* Clears the observer list so that this object no longer has any observers.

*/

default void deleteObservers() {

observable.deleteObservers();

}

default void setChanged() {

try {

Method method = Observable.class.getDeclaredMethod("setChanged", new Class[] {});

method.setAccessible(true);

method.invoke(observable, 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();

public static void main(String[] args) {

new Observer1();

new Observer2();

new Observer3();

testObservable.notifyObservers();

}

}

这是实现了被观察者接口的对象的类,带测试。

Observer2、和Observer3和Observer1是一样的,只是类名和输出部分一点点不同。

//运行结果。

i'm Obverser3: java.util.Observable@6d06d69c

i'm Obverser2: java.util.Observable@6d06d69c

i'm Obverser1: java.util.Observable@6d06d69c

是不是很棒!!! 欢迎喜欢java技术的同学加我微信dongping8887,互相交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值