观察者模式地原理其实和监听器一样,使用地关键在于搞清楚说明是观察者,什么是被观察者
1.观察者相当于事件监听
2.被观察者相当于事件源和事件
/**
* 观察者
*/
public class Watcher implements Observer {
/**
* This method is called whenever the observed object is changed. An
* application calls an <tt>Observable</tt> object's
* <code>notifyObservers</code> method to have all the object's
* observers notified of the change.
*
* @param o the observable object.
* @param arg an argument passed to the <code>notifyObservers</code>
*/
@Override
public void update(Observable o, Object arg) {
if (arg.toString().equals("openWindow")) {
System.out.println("打开窗口 --- "+ this.getClass());
}
}
}
/**
* 被观察者
*/
public class Watched extends Observable {
@Override
public void notifyObservers(Object arg) {
/**
* 为了避免并发冲突,设置了changed标志位 changed = true,当前线程可观察所有观察者,内部同步块会设置为false
* 通知过程中,正在新注册和撤销地无法通知到
*/
super.setChanged();
/**
* 事件触发,通知所有感兴趣地观察者
*/
super.notifyObservers(arg);
}
}
public class WatcherDome {
public static void main(String[] args) {
// 被观察者
Watched watched = new Watched();
// 观察者
Watcher watcher = new Watcher();
// 为被观察者 注入 观察者
watched.addObserver(watcher);
watched.addObserver(new Observer() {
@Override
public void update(Observable o, Object arg) {
if (arg.toString().equals("closeWindow")) {
System.out.println("关闭窗口 ---- " + this.getClass());
}
}
});
watched.notifyObservers("openWindow");
watched.notifyObservers("closeWindow");
}
}
打开窗口 --- class com.example.desing_mode.observer.Watcher
关闭窗口 ---- class com.example.desing_mode.observer.WatcherDome$1
当一个对象发生改变时,把这种改变通知给其他对象,从而影响其他对象地行为。
从实现和调用过程来看,观察者和监听器模式基本一样,基本都是这个逻辑事件源对象上发生操作,它将调用事件监听器地一个方法,并将事件对象传递过去,套用到观察者模式上面就是,当被观察者发生操作时,观察者将根据观察者所做出地操作进行对应的操作
浙公网安备 33010602011771号