Java编程之内置观察者模式实例详解
本文实例讲述了Java内置观察者模式。分享给大家供大家参考,具体如下:
之前也简单地写过观察者模式(又称为发布-订阅模式)小例子,现在项目中也常用到该模式。今天贴一下如何使用Java内置的观察者模式。
主要使用到的JavaAPI就两个类:
Observer接口:观察者对象,监听被观察者对象数据变化,一是数据发生变化,就做出相应地啥响应。
Observable类:被观察者对象,提供添加及移出观察者对像方法,数据发生哟完成时并通知所有已经添加进来的观察者对象。
被观察者代码示例:
//Observable是被观察者对象接口,实现该接口就是:目标(被观察者)的具体实现 publicclassTargetObservableextendsObservable{ //要观察的数据:消息发生改变时,所有被添加的观察者都能收到通知 privateStringmessage; publicStringgetConent(){ returnmessage; } publicvoidsetMessage(Stringmessage){ this.message=message; //被观察者数据发生变化时,通过以下两行代码通知所有的观察者 this.setChanged(); this.notifyObservers(message); } }
2个观察者代码示例:
//Observer对象是观察者,实现Observer的对象就是具体的观察者对象 publicclassTargetObserverimplementsObserver{ //定义观察者名称 privateStringname; publicStringgetObserverName(){ returnname; } publicvoidsetObserverName(StringobserverName){ this.name=observerName; } @Override publicvoidupdate(Observablearg0,Objectarg1){ //更新消息数据 System.out.println(name+"收到了发生变化的数据内容是:" +((TargetObservable)arg0).getConent()); } }
publicclassTargetObserver01implementsObserver{ //定义观察者名称 privateStringname01; publicStringgetObserverName(){ returnname01; } publicvoidsetObserverName(StringobserverName){ this.name01=observerName; } @Override publicvoidupdate(Observablearg0,Objectarg1){ //更新消息数据 System.out.println(name01+"收到了发生变化的数据内容是:" +((TargetObservable)arg0).getConent()); } }
测试代码:
/** *@description:测试类 *@authorldm *@date2016-11-1上午8:29:07 */ publicstaticvoidmain(String[]args){ //创建一个具体的被观察者 TargetObservableobservable=newTargetObservable(); //创建第一个观察者 TargetObserverone=newTargetObserver(); one.setObserverName("我是观察者A"); //创建第二个观察者 TargetObserver01two=newTargetObserver01(); two.setObserverName("我是观察者B"); //注册观察者 observable.addObserver(one); observable.addObserver(two); //目标更新天气情况 observable.setMessage("***我要更新的数据***"); } }
执行结果:
我是观察者B收到了发生变化的数据内容是:—–我要更新的数据—– 我是观察者A收到了发生变化的数据内容是:—–我要更新的数据—–
模式优点:
一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息通知给所有已经添加观察者。基于接口实现为程序提供了更大的灵活性。
但在使用时要注意根据条件及时添加或移除观察者对象,否则可能导致意料外结果。
最后附上Observer和Observable的原码,这样我们自己在写的时候就知道如何下手了:
packagejava.util; importjava.util.Observable; publicinterfaceObserver{ voidupdate(Observablevar1,Objectvar2); }
packagejava.util; importjava.util.Observer; importjava.util.Vector; publicclassObservable{ privatebooleanchanged=false; privateVectorobs=newVector(); publicObservable(){ } publicsynchronizedvoidaddObserver(Observervar1){ if(var1==null){ thrownewNullPointerException(); }else{ if(!this.obs.contains(var1)){ this.obs.addElement(var1); } } } publicsynchronizedvoiddeleteObserver(Observervar1){ this.obs.removeElement(var1); } publicvoidnotifyObservers(){ this.notifyObservers((Object)null); } publicvoidnotifyObservers(Objectvar1){ Object[]var2; synchronized(this){ if(!this.changed){ return; } var2=this.obs.toArray(); this.clearChanged(); } for(intvar3=var2.length-1;var3>=0;--var3){ ((Observer)var2[var3]).update(this,var1); } } publicsynchronizedvoiddeleteObservers(){ this.obs.removeAllElements(); } protectedsynchronizedvoidsetChanged(){ this.changed=true; } protectedsynchronizedvoidclearChanged(){ this.changed=false; } publicsynchronizedbooleanhasChanged(){ returnthis.changed; } publicsynchronizedintcountObservers(){ returnthis.obs.size(); } }
更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。