设计模式学习总结-观察者模式
定义
Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。
从这段话里我们可以得到两个信息,如下:
1 观察者(具体执行操作的对象,有多个)
2 被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操)
UML图
代码实例
下面展示了一个简单的观察者模式,或者说监听器的实现。Subject对象集成了Observable抽象类,具有的加入监听器的功能,同时当其执行业务逻辑时,即出发监听器,各个监听器均执行update方法。
Observer 接口:
public interface Observer { void update(Observable o); } |
Observer接口的实现一——JMS监听器:
public class JMSObserver implements Observer{ public void update(Observable o) { System.out.println("发现操作!启动JMS通知预警!"); } } |
Observer接口的实现二——邮件监听器:
public class MailObserver implements Observer{ public void update(Observable o) { System.out.println("发现操作!启动Mail邮件通知预警!"); } } |
Observable抽象类:
public class Observable { private Vector obs; /** * 创建被观察者时就创建一个它持有的观察者列表,注意,这个列表是需要同步的。 */ public Observable() { obs = new Vector(); } /** * 添加观察者到观察者列表中去 */ public synchronized void addObserver(Observer o) { obs.addElement(o); } /** * 删除一个观察者 */ public synchronized void deleteObserver(Observer o) { obs.removeElement(o); } /** * 通知操作,即被观察者发生变化,通知对应的观察者进行事先设定的操作 */ public void notifyObservers() { Iterator iter = obs.iterator(); while(iter.hasNext()){ Observer observer = iter.next(); observer.update(this); } } } |
实际对象,继承自Observable抽象类:
public class Subject extends Observable{ /** * 业务方法,一旦执行某个操作,则通知观察者 */ public void doBusiness(){ System.out.println("我们干正事,执行操作啦"); notifyObservers(); } } |
测试主方法:
public static void main(String[] args) { //创建一个被观察者 Subject subject = new Subject(); //创建两个观察者 Observer mailObserver = new MailObserver(); Observer jmsObserver = new JMSObserver(); //把两个观察者加到被观察者列表中 subject.addObserver(mailObserver); subject.addObserver(jmsObserver); //执行业务操作 subject.doBusiness(); } |
输出:
我们干正事,执行操作啦 发现操作!启动Mail邮件通知预警! 发现操作!启动JMS通知预警!