观察者模式(Observer)
观察者模式,定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。例如,邮件订阅和RSS订阅,当你订阅了改文章,如果有后续更新,会及时通知你。关系图如下:
我解释下这些类的作用:MySubject类就是我们的主题,Observer1和Observer2是依赖于MySubject的对象,当MySubject变化时,Observer1和Observer2必然变化。AbstractSubject类是主题的基类,定义了主题通用方法。
主题接口:
public interface ISubject { /** 增加观察者 */ public void add(IObserver observer); /** 删除观察者 */ public void del(IObserver observer); /** 通知所有观察者 */ public void notifyObservers(); /** 自身操作 */ public void operation(); }
主题基类:
public abstract class AbsSubject implements ISubject{ private Vector<IObserver> observers = new Vector<IObserver>(); @Override public void add(IObserver observer) { observers.add(observer); } @Override public void del(IObserver observer) { observers.remove(observer); } @Override public void notifyObservers() { Enumeration<IObserver> enumo = observers.elements(); while(enumo.hasMoreElements()){ enumo.nextElement().update(); } } }
我的主题:
public class MySubject extends AbsSubject{ @Override public void operation() { System.out.println("有新通知!"); notifyObservers(); } }
观察者接口:
public interface IObserver { public void update(); }
两个观察者:
public class Observer1 implements IObserver{ @Override public void update() { System.out.println(getClass().getSimpleName() + "收到通知了!"); } }
public class Observer2 implements IObserver{ @Override public void update() { System.out.println(getClass().getSimpleName() + "收到通知了!"); } }
测试:
public class Test { public static void main(String[] args) { MySubject subject = new MySubject(); subject.add(new Observer1()); subject.add(new Observer2()); subject.operation(); } }
输入结果:
有新通知!
Observer1收到通知了!
Observer2收到通知了!
改编于,如需看原文请点击:http://blog.csdn.net/zhangerqing/article/details/8194653