【移动应用开发技术】观察者的使用_第1页
【移动应用开发技术】观察者的使用_第2页
【移动应用开发技术】观察者的使用_第3页
【移动应用开发技术】观察者的使用_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】观察者的使用

观察者模式二话不说,上来就是定义定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新这个好像还好理解那么一点点,不过还是先来讲个情景,天气预报的短信服务,一旦付费订阅,每次天气更新都会向你及时发送其实就是我们无需每时每刻关注我们感兴趣的东西,我们只需要订阅它即可,一旦我们订阅的事务有变化了,被订阅的事务就会即时的通知我们我们来看一下观察者模式的组成:观察者,我们称它为Observer,有时候我们也称它为订阅者,即Subscriber被观察者,我们称它为Observable,即可以被观察的东西,有时候还会称之为主题,即Subject至于观察者模式的具体实现,java里为我们提供了Observable类和Observer接口供我们快速实现该模式,但是这里为了加深印象,不用这个两个类,以下是观察者模式的代码实现:1、首先我们定义一个的接口,里面是观察者需要做的三件事:publicinterfaceObjectAble{publicvoidadd(ObjectSerTypetype,ObjectServerobj);//添加订阅publicvoidremove(ObjectSerTypetype,ObjectServerobj);//取消订阅voidnotifyDataChange(ObjectSerTypetype,Object...objs);//发送订阅内容}2、当主题发生变化的时候,需要通知观察者来做出响应,还需要一个onRecever方法,具体实现如下publicinterfaceObjectServer{voidonRecever(Object...obj);}3、定义观察者类型的枚举类,这是表示观察者的类型,当触发ObjectAble接口中的notifyDataChangee(ObjectSerTypetype,Object...objs)方法时,即主题发生变化,所有类型为type的已订阅的观察者会被触发。packagecom.example.testobjectserver;publicenumObjectSerType{a,b,c,d}4、实现ObjectAble接口,为每个方法添加逻辑packagecom.example.testobjectserver;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importandroid.util.Log;publicclassObjectAbleImpeletimplementsObjectAble{publicstaticArrayList<HashMap<ObjectSerType,ObjectServer>>ObjectServerList=newArrayList<HashMap<ObjectSerType,ObjectServer>>();staticObjectAbleImpeletinstance=null;publicstaticObjectAbleImpeletgetInstance(){synchronized(ObjectAbleImpelet.class){if(instance==null)instance=newObjectAbleImpelet();}returninstance;};@Overridepublicvoidadd(ObjectSerTypetype,ObjectServerobj){if(type==null&&obj==null)thrownewNullPointerException("ObjectSerTypeorObjectServercannotnull");synchronized(ObjectServerList){HashMap<ObjectSerType,ObjectServer>map=newHashMap<ObjectSerType,ObjectServer>();map.put(type,obj);ObjectServerList.add(map);Log.e("","ObjectServerList>>>"+ObjectServerList);}}@Overridepublicvoidremove(ObjectSerTypetype,ObjectServerobj){for(HashMap<ObjectSerType,ObjectServer>map:ObjectServerList){Log.e("","type>>>"+type);if(map.get(type).equals(obj)){ObjectServerList.remove(map);Log.e("","obj>>>"+obj);break;}}}@OverridepublicvoidnotifyDataChange(ObjectSerTypetype,Object...objs){for(inti=0;i<ObjectServerList.size();i++){HashMap<ObjectSerType,ObjectServer>map=ObjectServerList.get(i);if(map.containsKey(type)){map.get(type).onRecever(objs);}}}}5、测试:packagecom.example.testobjectserver;importandroid.app.Activity;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.Menu;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.TextView;publicclassMainActivityextendsActivityimplementsObjectServer{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ObjectAbleImpelet.getInstance().add(ObjectSerType.a,this);//添加订阅,类型为ObjectSerType.a,类型由开发者定义findViewById(R.id.button1).setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){//TODOAuto-generatedmethodstubObjectAbleImpelet.getInstance().notifyDataChange(ObjectSerType.a,"你好");//主题发生变化,触

//发所有类型为ObjectSerType.a的观察者调用onRecever方法}});}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.getMenuInflater().inflate(R.menu.main,menu);returntrue;}

//主题变化后,观察者的回调@OverridepublicvoidonRecever(Object...obj){Log.e("","我是观察者!!!"+(String)obj[0]);((TextView)findViewById(R.id.textView1)).setText(""+(String)obj[0]);}@OverrideprotectedvoidonDestroy(){//无论如何,当退出activity,该activity中的观察者

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论