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程序设计有所帮助。
热门推荐
10 五一公司放假祝福语简短
11 追星女孩的祝福语简短
12 给长辈端午祝福语 简短
13 生日祝福语有诗意简短
14 团圆日祝福语简短
15 中秋商务祝福语简短最新
16 温暖文艺简短祝福语短句
17 男孩上学祝福语简短的
18 入住酒店文案祝福语简短