今天接触一个新项目(前辈开发过得),很多类都继承了Observable这个类。不明其意,后来百度了下。又收获了一点知识,这里分享一下。
假设现在有2个类,当一个类A的某个值改变的时候另外一个类B需要马上作出反应。可能这个问题可以用多种方法解决,这里讨论怎么用观察者模式解决。
jdk提供了一个类java.util.Observable,继承它的类称之为被观察者。还提供了Observer接口,实现它的类称之为观察者。与上面的对应,类A就是被观察者,需要继承Observable类,类B就是观察者,需要实现Observer接口。
一个被观察者可以添加多个观察者,也就是类A可以同时被多个类观察。下面贴一段一个类被两个类观察的代码。
这是被观察者的代码
public class ObservableTest extends Observable {
public int num = 0;
public void addNum() {
num += 1;
//标记该对象已经发生改变
setChanged();
if (num % 2 == 0) {
//通知观察者,观察者通过上面的标记来判断被观察者的状态是否改变
notifyObservers("odd");
}else{
notifyObservers("single");
}
}
}
这是观察者的代码
public class ObserverTest implements Observer {
@Override
public void update(Observable o, Object arg) {
//强制转换成被观察者的对象
ObservableTest ob = (ObservableTest) o;
// 前面的notifyObservers()如果不带参数,那么这里的arg会为null
if("single".equals(arg)){
System.out.println("test1 -> 这个数字是奇数 值是 " + ob.num);
}
}
}
public class ObserverTest2 implements Observer {
@Override
public void update(Observable o, Object arg) {
ObservableTest ob = (ObservableTest) o;
if("odd".equals(arg)){
System.out.println("test2 -> 这个数字是偶数 值是 " + ob.num);
}
}
}
下面进行测试
public static void main(String[] args) {
ObservableTest ob = new ObservableTest();
//给被观察者添加两个观察者
ob.addObserver(new ObserverTest());
ob.addObserver(new ObserverTest2());
ob.addNum();
ob.addNum();
ob.addNum();
ob.addNum();
}
最后贴出结果