这是JDK中自带的观察者实现,其中Observable是一个类,而Observer是一个接口。
Observable翻译过来意思为:可观察的,也可理解为数据类,大多数观察的情形是观察数据的变化,比如消息数据库,收到一条消息,我们就往数据库插入一条消息,界面上就应该监听这个数据库,这样就能知道有新消息了,就可以把新消息显示出来,或者别人撤回了一条消息,则数据库删除一条消息,则界面也应该能监听到,及时显示用户撤回了一条消息。
Observable的源码也很简单,一看就懂,总共有9个函数,这里简单总结一下:
使用Vector这种类型的集合来保存观察者,对于这个集合的操作函数都是同步的,所以多线程操作也没问题,对于操作观察者的函数有:
有了观察者,当数据发生变化时就可以通知观察者了,但是在通知之前需要修改一个成员变量的值:boolean changed,当数据发生改变时要设置为true(需要手动操作),当通知了观察者之后要设置为false(不需要手动操作,notifyObservers函数内部会自动设置),使用changed变量的好处是可以预防一次改变多次通知,发生一次改变,你调用多次notifyObservers()函数,观察者也只会收到一次通知。对于changed变量操作的对应方法如下:
当数据发生了变化时,就可以调用setChanged() ,然后就可以调用通知函数了,通知函数如下:
/** 消息数据库 */
public class MessageDatabase extends Observable {
private List<String> messages = new ArrayList<>();
public void insertMessage(String message) {
messages.add(message);
setChanged();
notifyObservers(message);
}
}
/** 消息UI界面 */
public class MessageUI {
public static void main(String[] args) {
MessageDatabase db = new MessageDatabase();
db.addObserver((o, arg) -> {
System.out.println(o.getClass().getSimpleName() + "中数据发生变化:" + arg);
});
db.insertMessage("恭喜你,获得VIP门票一张!");
}
}
运行main函数,即可看到如下输出:
MessageDatabase中数据发生变化:恭喜你,获得VIP门票一张!