预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

又叫做发布-订阅模式(publish/Subscrib),观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。结构如下: 具体主题类ConcreteSubject有一个Vector属性来保存具体观察者。结构也可以用以下形式表示: 如果有个天气布告板系统,代码如下: 主题接口 //主题接口 publicinterfaceSubject{ //增加观察者 publicvoidaddObserver(Observerob); //删除观察者 publicvoidremoveObserver(Observerob); //通知观察者 publicvoidnotifyObservers(); //主题变动 publicvoidchange(Subjectsub); }具体主题对象,天气数据 publicclassWeatherDataimplementsSubject{ privatefloattemp; privatefloathumidity; privatefloatpressure; privateSet<Observer>obs; publicWeatherData(floattemp,floathumidity,floatpressure){ this.temp=temp; this.humidity=humidity; this.pressure=pressure; obs=newHashSet<Observer>(); } publicvoidaddObserver(Observerob){ obs.add(ob); } publicvoidnotifyObservers(){ for(Observero:obs){ o.update(this); } } publicvoidchange(floattemp,floathumidity,floatpressure){ this.temp=temp; this.humidity=humidity; this.pressure=pressure; notifyObservers();//主题变动,通知观察者 } publicvoidremoveObserver(Observerob){ if(obs.contains(ob)) obs.remove(ob); } }观察者接口 //观察者接口 publicinterfaceObserver{ publicvoidupdate(Subjectsubject); }具体观察者,布告板 publicclassSoObserverimplementsObserver{ publicvoidupdate(Subjectsubject){ subject.addObserver(this);//把自己作为观察者添加到主题上 System.out.println("nowweatherdatais:"+subject.toString()); } publicstaticvoidmain(String[]args){ Subjectsub=newWeatherData(10,20,30); Observerob1=newSoObserver(); Observerob2=newSoObserver(); sub.addObserver(ob1); sub.addObserver(ob2); sub.change(20,30,40); sub.change(30,40,50); } } 这种方式,当主题发生变化的时候,会立刻通知给观察者,此时观察者可能在做着其他事情。这属于“拉”的方式。即把主题状态的变化通知给观察者,如果观察者需要知道具体变化内容到主题那边去取。 还有一种方式,是“推”的方式,即主题主动把改变的数据通知给观察者。但缺点是主题就把自己暴露给了观察者。 Java内置了观察者模式,Observable类作为主题,Observer接口和之前类似,都是观察者。 Observable方法如下: voidHYPERLINK"mk:@MSITStore:C:\\Documents%20and%20Settings\\Administrator\\桌面\\JDK_1_6.CHM::/java/util/Observable.html"\l"addObserver(java.util.Observer)"addObserver(HYPE