原理
因为观察者模式使用非常频繁,Java其实已经提供了观察者模式的实现。在java.util包中有如下两个类型(在JDK11中已经去除):
- java.util.Observer:观察对象,就是我们上面的Observer。Observ接口提供了如下常用的方法:
- void update(Observable o, Object arg) 只要observable 对象发生了改变,就会调用此方法。
java.util.Observable:可被观察对象,即我们的Subject。Observable接口提供了如下常用的方法:
- void addObserver(Observer o) 如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者。
- protected void clearChanged() 指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasChanged 方法将返回 false。
- int countObservers() 返回 Observable 对象的观察者数目。
- void deleteObserver(Observer o) 从对象的观察者集合中删除某个观察者。
- void deleteObservers() 清除观察者列表,使此对象不再有任何观察者。
- boolean hasChanged() 测试对象是否改变。
- void notifyObservers() 如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。
- void notifyObservers(Object arg) 如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。
- protected void setChanged() 标记此 Observable 对象为已改变的对象,调用该方法后 hasChanged 方法将返回 true。
老师在答疑时间,原来是不停地在下面走动,发现学生有问题,然后问学生。现在利用观察者模式,当答疑时间到了的话,告诉学生可以问问题了,然后老师就可以坐下来休息,等有问题的学生来问问题了。
- 学生类:
public class Stu1 implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println("stu1");
}
}
public class Stu2 implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println("stu2");
}
}
- 老师类:
public class Teacher extends Observable {
public static void main(String[] args) {
Stu1 stu1 = new Stu1();
Stu2 stu2 = new Stu2();
Teacher teacher = new Teacher();
teacher.addObserver(stu1);
teacher.addObserver(stu2);
teacher.setChanged();//答疑时间到
teacher.notifyObservers();//通知学生,下面老师就可以坐下来等学生来问问题了
}
}
运行程序,结果如下图所示: