好,现在就可以直接使用了:
public class TestUse { public static void main(String args[]){ //创建主题 WeatherService service = WeatherService.instance; //添加观察者 service.addClient(new ClientAndroidServer()); service.addClient(new ClientIphoneServer()); //更新主题 service.updateWeather(new WeatherInfo(System.currentTimeMillis(), "多云")); service.updateWeather(new WeatherInfo(System.currentTimeMillis()1000*60*60*24, "多云转晴")); service.updateWeather(new WeatherInfo(System.currentTimeMillis()1000*60*60*24*2, "晴")); }}
运行后,控制台有如下输出:
安卓服务收到最新天气:time=1461246047007msg=多云。马上开始推送消息...苹果服务收到最新天气:time=1461246047007msg=多云。马上开始推送消息...安卓服务收到最新天气:time=1461332447007msg=多云转晴。马上开始推送消息...苹果服务收到最新天气:time=1461332447007msg=多云转晴。马上开始推送消息...安卓服务收到最新天气:time=1461418847007msg=晴。马上开始推送消息...苹果服务收到最新天气:time=1461418847007msg=晴。马上开始推送消息...
可以看出,观察者模式是一对多的。而本例是将更新的内容整个推给客户端。
而观察者模式中的数据有推和拉的区别,上例是推。
推的方式会将主题更改的内容全部直接推给客户端,拉的方式就是主题的数据更新后,不直接将数据推给客户端,而是先推送一个通知并提供对应的方法供客户端拉取数据。
如果上例中,天气服务每半小时更新(半点和整点推消息),还有一个客户端,不需要特别即时的天气消息,只取整点的消息,那么我们就可以使用拉的方式,数据更新后,给客户端推送一个标志,客户端自己按需取得数据(天气服务需要提供这样一个接口)。这就是拉。
java.util包中也提供了观察者模式的支持,因为java程序设计中使用比较广泛。有一个Observable类(相当于这里的具体主题)和一个Observer接口(相当于这里的主题接口):
public intece Observer { void update(Observable o, Object arg);}public class Observable { private boolean changed = false; private Vector<Observer> obs; public Observable() { obs = new Vector<>();} public synchronized void addObserver(Observer o) { if (o == null) throw new NullPointerException(); if (!obs.contains(o)) { obs.addElement(o); } } public synchronized void deleteObserver(Observer o) { obs.removeElement(o); } public void notifyObservers() { notifyObservers(null); } public void notifyObservers(Object arg) { Object[] arrLocal; synchronized (this) { if (!changed) return; arrLocal = obs.toArray(); clearChanged(); } for (int i = arrLocal.length-1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg); } public synchronized void deleteObservers() { obs.removeAllElements(); } protected synchronized void setChanged() { changed = true; } protected synchronized void clearChanged() { changed = false; } public synchronized boolean hasChanged() { return changed; } public synchronized int countObservers() { return obs.size(); }}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33893-26.html
上高中学文的
美国扰乱了伊拉克