设计模式-观察者模式的JDK实现关键字: 设计模式
今天在翻查JAVA API的时候发现了特别的类java.util.Observable和接口
java.util.Observer,细看发现原来是java类库实现观察着(Observer)模式的类和接口。 观察者模式定义: 观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF给观察者模式如下定义:定义对象Observer间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 Observable和Observer的说明: 继承于Observable的子类表示被观察的对象,实现了接口Observer的类表示观察者.在下面的例子中继承于Observable的子类 NewsDispatcher(新闻派发器)表示被观察的对象,在有新的新闻的时候会把新闻内容派发给所有的订阅者(Reader),Reader是实现了Observer接口的类表示读者。 Observable的简单功能介绍: addObserver(Observer o) clearChanged() 清除变化,则把“变化标志”设为false countObservers() 统计观察着数量 deleteObserver(Observer o) 删除观察者 deleteObservers() 删除所有的观察者 hasChanged() 测试是否有变化(则返回“变化标志”) notifyObservers() 如果hasChanged()=ture,通知所有的观察着(则调用Observer.update()方法) notifyObservers(Object arg) 如果hasChanged()=ture,通知所有的观察着(则调用Observer.update()方法),并把参数arg传过去 setChanged() 设置变化,则把“变化标志”设为true Observable的简单功能介绍 update(Observable o, Object arg) Observable唯一的方法,在被通知时被Observable调用 例子代码:
package com.pasu.observer; import java.util.Observable; public class NewsDispatcher extends Observable { public void addNews(String news) { this.setChanged(); this.notifyObservers(news); } }
package com.pasu.observer; import java.util.Observable; import java.util.Observer; public class Reader implements Observer { private String name; public Reader(String name) { this.name = name; } @Override public void update(Observable o, Object arg) { String news = (String)arg; System.out.println(name + " : " + news); } }
package com.pasu.observer; public class Test { public static void main(String[] args) { //体育新闻派发器 NewsDispatcher sportNewsDispatcher = new NewsDispatcher(); //it新闻派发器 NewsDispatcher itNewsDispatcher = new NewsDispatcher(); //观察者r1,r2,r3 Reader r1 = new Reader("r1"); Reader r2 = new Reader("r2"); Reader r3 = new Reader("r3"); //添加观察者 sportNewsDispatcher.addObserver(r1); sportNewsDispatcher.addObserver(r2); itNewsDispatcher.addObserver(r3); //当有新的新闻的时候,通知观察者 sportNewsDispatcher.addNews("中国队突破了历史获得了世界杯冠军!"); itNewsDispatcher.addNews("ibm 收购 sun公司,java开始收费!"); } } Test类运行输出的结果 |
|