Android观察者模式实例分析
本文实例讲述了Android观察者模式。分享给大家供大家参考。具体分析如下:
一、环境:
主机:WIN8
开发环境:Eclipse
二、说明:
1.打开sd卡中的xml文件,如果不存在,这新建一个,并写入默认配置
2.读取xml文件
3.Config_Info.java为配置信息数据结构
4.IF_Config.java为配置类的存取接口,其他类可以通过此接口直接获取配置信息
5.IF_Subject_Config.java为观察者模式目标类接口
6.IF_Observer_Config.java为观察者模式观察者类接口
7.Config.java为配置类,完成1,2两部工作,同时是观察者模式的目标类,一旦配置信息由变化着通知观察者类
8.TestClass.java为观察者模式的观察者
通过存取接口+观察者模式可以实现松耦合的设计。
三、xml文件格式:
<?xmlversion="1.0"encoding="UTF-8"standalone="true"?> -<config> <title>远程视频会见系统</title> <local_port>12600</local_port> <schedule_service_ip>10.58.1.59</schedule_service_ip> <schedule_service_port>12601</schedule_service_port> </config>
四、源代码:
Config_Info.java:
/** *配置信息数据类型 *新建时间:2014/12/8byjdh */ packagecom.example.helloanychat; publicclassConfig_Info{ //标题 publicStringtitle; //本机ip publicStringlocal_ip; //本机端口 publicintlocal_port; //调度服务器ip publicStringschedule_server_ip; //调度服务器端口 publicintschedule_server_port; }
IF_Config.java:
/** *接口:配置类,读写 *新建时间:2014/12/8byjdh */ packagecom.example.helloanychat; publicinterfaceIF_Config{ publicConfig_Infoget_config_info(); }
IF_Subject_Config.java:
/** *接口:配置类,观察者模式:目标 *新建时间:2014/12/8byjdh */ packagecom.example.helloanychat; publicinterfaceIF_Subject_Config{ publicvoidregister_observer(IF_Observer_Configobserver); publicvoidremove_observer(IF_Observer_Configobserver); publicvoidnotify_observer(); }
IF_Observer_Config.java:
/** *接口:配置类,观察者模式:观察者 *新建时间:2014/12/8byjdh */ packagecom.example.helloanychat; publicinterfaceIF_Observer_Config{ publicvoidupdate(Config_Infoinfo); }
Config.java:
/** *配置信息类 *新建日期:2014/12/8byjdh *修改日期:2014/12/9byjdh */ packagecom.example.helloanychat; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.StringWriter; importjava.net.Inet6Address; importjava.net.InetAddress; importjava.net.NetworkInterface; importjava.net.SocketException; importjava.util.ArrayList; importjava.util.Enumeration; importjava.util.List; importjava.util.Timer; importjava.util.TimerTask; importjavax.xml.parsers.DocumentBuilder; importjavax.xml.parsers.DocumentBuilderFactory; importandroid.os.Environment; importandroid.util.Log; importorg.w3c.dom.Document; importorg.w3c.dom.Element; importorg.w3c.dom.NodeList; importorg.xmlpull.v1.XmlPullParserFactory; importorg.xmlpull.v1.XmlSerializer; publicclassConfigimplementsIF_Config,IF_Subject_Config{ //配置信息 privateConfig_InfoInfo=newConfig_Info(); //存储观察者的列表 privateList<IF_Observer_Config>Observers=newArrayList<IF_Observer_Config>(); //定时器 privateTimerTimer_Work=newTimer(); //工作间隔,单位:ms privatefinalintINTERVAL_WORK=5000; /** *构造函数 */ publicConfig(){ //生成配置信息 generate_config_info(); //创建定时线程 Timer_Work.schedule(newTask(),INTERVAL_WORK,INTERVAL_WORK); //定时任务 } //接口:读写 @Override publicConfig_Infoget_config_info(){ returnInfo; } //读写,观察者模式:目标 @Override publicvoidregister_observer(IF_Observer_Configobserver){ Observers.add(observer); } @Override publicvoidremove_observer(IF_Observer_Configobserver){ intindex=Observers.indexOf(observer); if(index>=0){ Observers.remove(observer); } } @Override publicvoidnotify_observer(){ for(inti=0;i<Observers.size();i++){ IF_Observer_Configo=(IF_Observer_Config)Observers.get(i); o.update(Info); } } /** *得到本机ip地址 *@return本机ip地址 */ privateStringgetLocalIpAddress(){ try{ for(Enumeration<NetworkInterface>en=NetworkInterface .getNetworkInterfaces();en.hasMoreElements();){ NetworkInterfaceintf=en.nextElement(); for(Enumeration<InetAddress>enumIpAddr=intf .getInetAddresses();enumIpAddr.hasMoreElements();){ InetAddressinetAddress=enumIpAddr.nextElement(); //if(!inetAddress.isLoopbackAddress()){ if(!inetAddress.isLoopbackAddress()&&!(inetAddressinstanceofInet6Address)){ returninetAddress.getHostAddress().toString(); } } } }catch(SocketExceptionex){ Log.e("WifiPreferenceIpAddress",ex.toString()); } returnnull; } /** *生成xml配置文件的String数据流 *Config_Info的本机ip信息不会保存 *@paraminfo:配置信息 *@returnxml的String数据流 */ privateStringproduce_xml_string(Config_Infoinfo){ StringWriterstringWriter=newStringWriter(); try{ //获取XmlSerializer对象 XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance(); XmlSerializerxmlSerializer=factory.newSerializer(); //设置输出流对象 xmlSerializer.setOutput(stringWriter); //开始标签 xmlSerializer.startDocument("utf-8",true); xmlSerializer.startTag(null,"config"); //标题 xmlSerializer.startTag(null,"title"); xmlSerializer.text(info.title); xmlSerializer.endTag(null,"title"); //本机端口 xmlSerializer.startTag(null,"local_port"); xmlSerializer.text(Integer.toString(info.local_port)); xmlSerializer.endTag(null,"local_port"); //调度服务器ip xmlSerializer.startTag(null,"schedule_service_ip"); xmlSerializer.text(info.schedule_server_ip); xmlSerializer.endTag(null,"schedule_service_ip"); //调度服务器端口 xmlSerializer.startTag(null,"schedule_service_port"); xmlSerializer.text(Integer.toString(info.schedule_server_port)); xmlSerializer.endTag(null,"schedule_service_port"); xmlSerializer.endTag(null,"config"); xmlSerializer.endDocument(); }catch(Exceptione){ e.printStackTrace(); } returnstringWriter.toString(); } /** *工作任务:得到配置信息 */ privatevoidgenerate_config_info() { booleanok; Filesd_path; Filefile_cfg_dir; Filefile_cfg; FileOutputStreamout; Stringstr; FileInputStreamin; Config_Infoinfo=newConfig_Info(); //得到本机ip地址 info.local_ip=getLocalIpAddress(); //获取SD卡目录 sd_path=Environment.getExternalStorageDirectory(); //判断文件夹是否存在 file_cfg_dir=newFile(sd_path.getPath()+"//Remote_Meeting"); if(!file_cfg_dir.exists()&&!file_cfg_dir.isDirectory()){ System.out.println("配置文件夹Remote_Meeting不存在!"); ok=file_cfg_dir.mkdirs(); if(ok){ System.out.println("创建文件夹成功!"); }else{ System.out.println("创建文件夹失败!"); } } //判断配置文件是否存在 file_cfg=newFile(file_cfg_dir.getPath(),"cfg.xml"); if(!file_cfg.exists()) { System.out.println("配置文件cfg.xml不存在!"); try{ file_cfg.createNewFile(); System.out.println("创建文件cfg.xml成功!"); //生成初始化的配置数据 try{ out=newFileOutputStream(file_cfg); //保存默认配置 Info.title="远程视频会见系统"; Info.local_port=12600; Info.schedule_server_ip="10.58.1.59"; Info.schedule_server_port=12601; str=produce_xml_string(Info); out.write(str.getBytes()); out.close(); //保存本机ip Info.local_ip=info.local_ip; //通知观察者 notify_observer(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } else { //解析xml文件 try{ in=newFileInputStream(file_cfg); DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=factory.newDocumentBuilder(); Documentdocument=builder.parse(in); //获取根节点 Elementroot=document.getDocumentElement(); NodeListnode=root.getChildNodes(); //获得第1子节点:标题 info.title=node.item(0).getFirstChild().getNodeValue(); //获得第2子节点:本机端口 info.local_port=Integer.parseInt(node.item(1).getFirstChild().getNodeValue()); //获得第3子节点:调度服务器ip info.schedule_server_ip=node.item(2).getFirstChild().getNodeValue(); //获得第4子节点:调度服务器端口 info.schedule_server_port=Integer.parseInt(node.item(3).getFirstChild().getNodeValue()); //判断配置信息是否变更 do { if(!info.title.equals(Info.title)) { break; } if(!info.local_ip.equals(Info.local_ip)) { break; } if(info.local_port!=Info.local_port) { break; } if(!info.schedule_server_ip.equals(Info.schedule_server_ip)) { break; } if(info.schedule_server_port!=Info.schedule_server_port) { break; } //全部相同 return; }while(false); //赋值 Info.title=info.title; Info.local_ip=info.local_ip; Info.local_port=info.local_port; Info.schedule_server_ip=info.schedule_server_ip; Info.schedule_server_port=info.schedule_server_port; //通知观察者 notify_observer(); }catch(Exceptione){ e.printStackTrace(); } } } /** *定时器线程定时工作 */ privateclassTaskextendsTimerTask{ @Override publicvoidrun(){ generate_config_info(); } } }
TestClass.java:
packagecom.example.helloanychat; publicclassTestClassimplementsIF_Observer_Config{ publicTestClass(){ } @Override publicvoidupdate(Config_Infoinfo){ System.out.printf("-------------更新数据:%s,%s,%d,%s,%d\n", info.title,info.local_ip,info.local_port,info.schedule_server_ip,info.schedule_server_port); } }
MainActivity:
TestClasstestclass=newTestClass(); Configconfig=newConfig(); mEditIP.setText(config.get_config_info().local_ip); config.register_observer(testclass);
希望本文所述对大家的Android程序设计有所帮助。