观察者模式地原理其实和监听器一样,使用地关键在于搞清楚说明是观察者,什么是被观察者
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
当一个对象发生改变时,把这种改变通知给其他对象,从而影响其他对象地行为。
从实现和调用过程来看,观察者和监听器模式基本一样,基本都是这个逻辑事件源对象上发生操作,它将调用事件监听器地一个方法,并将事件对象传递过去,套用到观察者模式上面就是,当被观察者发生操作时,观察者将根据观察者所做出地操作进行对应的操作