欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android观察者模式实例分析

程序员文章站 2022-03-23 14:06:10
本文实例讲述了android观察者模式。分享给大家供大家参考。具体分析如下: 一、环境: 主机:win8 开发环境:eclipse 二、说明: 1.打开sd卡中的...

本文实例讲述了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文件格式:

<?xml version="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/8 by jdh 
 */ 
package com.example.helloanychat; 
public class config_info { 
 //标题 
 public string title; 
 //本机ip 
 public string local_ip; 
 //本机端口 
 public int local_port; 
 //调度服务器ip 
 public string schedule_server_ip; 
 //调度服务器端口 
 public int schedule_server_port; 
}

if_config.java:

/** 
 * 接口:配置类,读写 
 * 新建时间:2014/12/8 by jdh 
 */ 
package com.example.helloanychat; 
public interface if_config { 
 public config_info get_config_info(); 
}

if_subject_config.java:

/** 
 * 接口:配置类,观察者模式:目标 
 * 新建时间:2014/12/8 by jdh 
 */ 
package com.example.helloanychat; 
public interface if_subject_config { 
 public void register_observer(if_observer_config observer); 
 public void remove_observer(if_observer_config observer); 
 public void notify_observer(); 
}

if_observer_config.java:

/** 
 * 接口:配置类,观察者模式:观察者 
 * 新建时间:2014/12/8 by jdh 
 */ 
package com.example.helloanychat; 
public interface if_observer_config { 
 public void update(config_info info); 
}

config.java:

/** 
 * 配置信息类 
 * 新建日期:2014/12/8 by jdh 
 * 修改日期:2014/12/9 by jdh 
 */ 
package com.example.helloanychat; 
import java.io.file; 
import java.io.fileinputstream; 
import java.io.fileoutputstream; 
import java.io.ioexception; 
import java.io.stringwriter; 
import java.net.inet6address; 
import java.net.inetaddress; 
import java.net.networkinterface; 
import java.net.socketexception; 
import java.util.arraylist; 
import java.util.enumeration; 
import java.util.list; 
import java.util.timer; 
import java.util.timertask; 
import javax.xml.parsers.documentbuilder; 
import javax.xml.parsers.documentbuilderfactory; 
import android.os.environment; 
import android.util.log; 
import org.w3c.dom.document; 
import org.w3c.dom.element; 
import org.w3c.dom.nodelist; 
import org.xmlpull.v1.xmlpullparserfactory; 
import org.xmlpull.v1.xmlserializer; 
public class config implements if_config,if_subject_config { 
 //配置信息 
 private config_info info = new config_info(); 
 //存储观察者的列表 
 private list<if_observer_config> observers = new arraylist<if_observer_config>(); 
 //定时器 
 private timer timer_work = new timer(); 
 //工作间隔,单位:ms 
 private final int interval_work = 5000; 
 /** 
 * 构造函数 
 */ 
 public config() { 
 //生成配置信息 
 generate_config_info(); 
 //创建定时线程 
 timer_work.schedule(new task(),interval_work,interval_work);
 // 定时任务 
 } 
 //接口:读写 
 @override 
 public config_info get_config_info() { 
 return info; 
 } 
 //读写,观察者模式:目标 
 @override 
 public void register_observer(if_observer_config observer) { 
 observers.add(observer); 
 } 
 @override 
 public void remove_observer(if_observer_config observer) { 
 int index = observers.indexof(observer); 
 if (index >= 0) { 
  observers.remove(observer); 
 } 
 } 
 @override 
 public void notify_observer() { 
 for (int i = 0; i < observers.size(); i++) { 
  if_observer_config o = (if_observer_config) observers.get(i); 
  o.update(info); 
 } 
 } 
 /** 
 * 得到本机ip地址 
 * @return 本机ip地址 
 */ 
 private string getlocalipaddress() { 
 try { 
  for (enumeration<networkinterface> en = networkinterface 
   .getnetworkinterfaces(); en.hasmoreelements();) { 
  networkinterface intf = en.nextelement(); 
  for (enumeration<inetaddress> enumipaddr = intf 
   .getinetaddresses(); enumipaddr.hasmoreelements();) { 
   inetaddress inetaddress = enumipaddr.nextelement(); 
   //if (!inetaddress.isloopbackaddress()) { 
   if (!inetaddress.isloopbackaddress() && !(inetaddress instanceof inet6address)) { 
   return inetaddress.gethostaddress().tostring(); 
   } 
  } 
  } 
 } catch (socketexception ex) { 
  log.e("wifipreference ipaddress", ex.tostring()); 
 } 
 return null; 
 } 
 /** 
 * 生成xml配置文件的string数据流 
 * config_info的本机ip信息不会保存 
 * @param info:配置信息 
 * @return xml的string数据流 
 */ 
 private string produce_xml_string(config_info info) { 
 stringwriter stringwriter = new stringwriter(); 
 try { 
  // 获取xmlserializer对象 
  xmlpullparserfactory factory = xmlpullparserfactory.newinstance(); 
  xmlserializer xmlserializer = 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 (exception e) { 
  e.printstacktrace(); 
 } 
 return stringwriter.tostring(); 
 } 
 /** 
 * 工作任务:得到配置信息 
 */ 
 private void generate_config_info() 
 { 
 boolean ok; 
 file sd_path; 
 file file_cfg_dir; 
 file file_cfg; 
 fileoutputstream out; 
 string str; 
 fileinputstream in; 
 config_info info = new config_info(); 
 //得到本机ip地址 
 info.local_ip = getlocalipaddress(); 
 //获取sd卡目录 
 sd_path = environment.getexternalstoragedirectory(); 
 //判断文件夹是否存在 
 file_cfg_dir = new file(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 = new file(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 = new fileoutputstream(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 (ioexception e) { 
   // todo auto-generated catch block 
   e.printstacktrace(); 
  } 
  } catch (ioexception e) { 
  // todo auto-generated catch block 
  e.printstacktrace(); 
  } 
 } 
 else 
 { 
  //解析xml文件 
  try { 
  in = new fileinputstream(file_cfg); 
  documentbuilderfactory factory = documentbuilderfactory.newinstance(); 
  documentbuilder builder = factory.newdocumentbuilder(); 
  document document = builder.parse(in); 
  // 获取根节点 
  element root = document.getdocumentelement(); 
  nodelist node = 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 (exception e) { 
  e.printstacktrace(); 
  } 
 } 
 } 
 /** 
 * 定时器线程定时工作 
 */ 
 private class task extends timertask { 
 @override 
 public void run() { 
  generate_config_info(); 
 } 
 } 
}

testclass.java:

package com.example.helloanychat; 
public class testclass implements if_observer_config { 
 public testclass () { 
 } 
 @override 
 public void update(config_info info) { 
 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:

testclass testclass = new testclass(); 
config config = new config(); 
meditip.settext(config.get_config_info().local_ip); 
config.register_observer(testclass); 

希望本文所述对大家的android程序设计有所帮助。