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文件格式:

<?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程序设计有所帮助。

(0)

相关推荐

  • Android源码学习之工厂方法模式应用及优势介绍

    工厂方法模式定义: Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses. 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 常用的工厂方法模式结构: 如上图所示(截取自<Head Firs

  • Android源码学习之单例模式应用及优点介绍

    单例模式定义: Ensure a class has only one instance, and provide a global point of access to it. 动态确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 如上图所示(截取自<Head First Design Patterns>一书). 通过使用private的构造函数确保了在一个应用中产生一个实例,并且是自行实例化(在Singleton中自己使用new Singleton()). 具体单例模式有

  • Android开发实现简单的观察者与被观察者示例

    本文实例讲述了Android开发实现简单的观察者与被观察者.分享给大家供大家参考,具体如下: 概述: 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己. 观察者模式结构图 Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个

  • Android 听筒模式的具体实现实例

    一.利用距离感应器监听听筒靠近耳朵事件准确的说距离感应器并不能监听到你是否把手机靠近耳朵,也许是你用手挡在了距离感应器前面,但这不是我们关心的,我们关心的是当你的耳朵靠近听筒时,我们要捕获到这个事件 step 1,新建实现SensorEventListener接口的类并实现onSensorChanged(SensorEvent event)方法 复制代码 代码如下: public class MainActivity extends Activity implements SensorEvent

  • android开发中使用java观察者模式

    复制代码 代码如下: //观察者,需要用到观察者模式的类需实现此接口public interface Observer { void update(Object... objs);} //被观察者(一个抽象类,方便扩展)public abstract class Observable { public final ArrayList<Class<?>> obserList = new ArrayList<Class<?>>(); /** Attach Obs

  • android设计模式之单例模式详解

    这是我们最常见的一类模式,对这一类模式有一个通用的特点就是: 封装创建的方式和过程. 这里所谓封装就是隐藏的意思,对对象的创建方法和过程不可见,或者是虚拟的过程. 隐藏创建方式,就是如单例,工厂方法,隐藏创建过程则是指builder,原型,至于抽象工厂,我认为他包含了以上两种. 我们想想一个对象的创建有哪些步骤? 1.创建什么东西?--接口定义 2.谁创建?        --决策类or帮助类 3.如何创建?     --how,创建过程 4.什么时候创建?    --创建时机的触发 由此可知,

  • Android回调与观察者模式的实现原理

    回调与观察者模式的实现原理:废话不多说,直接上Demo回调的原理: 观察者模式: A类中定义一个被观察者画家 package com.example.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.view.View; import java.util.ArrayList; /** * user: uidq0530

  • android基础教程之夜间模式实现示例

    复制代码 代码如下: package org.david.dayandnightdemo.cor; import android.os.Bundle;import android.app.Activity;import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.graphics.Col

  • Android源码学习之观察者模式应用及优点介绍

    观察者模式定义: Define a one-to-many dependency between objects so that when one object changes state, all its dependents aer notified and updated automatically. 定义对象间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新.  如上图所示(截取自<Head First Design Patterns>一书),

  • 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.jav

  • PHP观察者模式实例分析【对比JS观察者模式】

    本文实例讲述了PHP观察者模式.分享给大家供大家参考,具体如下: 1.用js实现观察者模式 <!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> div{width: 100px;height: 100px;border: 1px #999 solid;margin-bottom: 5px;} </style> <

  • android编程之多线程编程实例分析

    本文实例讲述了android编程之多线程编程实现方法.分享给大家供大家参考.具体分析如下: 该功能与前面<android开发socket编程之udp发送实例分析>中一样,当按下键后,发送文本框中数据给PC.不同的是把发送数据的功能放在一个线程socket_send中. 一.环境: win7 + eclipse + ndk 二.代码: 主类test_socket.java package test.soket; //import com.test_button.R; import java.io

  • Android 图片的三级缓存机制实例分析

    Android 图片的三级缓存机制实例分析 当我们获取图片的时候,如果不加以协调好图片的缓存,就会造成大流量,费流量应用,用户体验不好,影响后期发展.为此,我特地分享Android图片的三级缓存机制之从网络中获取图片,来优化应用,具体分三步进行: (1)从缓存中获取图片 (2)从本地的缓存目录中获取图片,并且获取到之后,放到缓存中 (3)从网络去下载图片,下载完成之后,保存到本地和放到缓存中 很好的协调这三层图片缓存就可以大幅度提升应用的性能和用户体验. 快速实现三级缓存的工具类ImageCac

  • Android中ImageView用法实例分析

    本文实例分析了Android中ImageView用法.分享给大家供大家参考,具体如下: 猜牌游戏大家可能以前都玩过,这里我们用这个小游戏来说明ImageView的用法. 首先,在res/drawable中引入三张牌:分别是梅花7,梅花8,梅花9 然后在res/layout/main.xml中配置一个TextView,三个ImageView以及一个Button <?xml version="1.0" encoding="utf-8"?> <Linea

  • Android中ListView用法实例分析

    本文实例分析了Android中ListView用法.分享给大家供大家参考,具体如下: 通过在Layout中添加ListView Widget可以达到在页面布局具有列表效果的交互页面.在这里通过举例来说明怎样在Layout中添加ListView以及怎样应用. 配合设计了两个事件Listener:  OnItemSelectedListener事件为鼠标的滚轮转动时所选择的值:OnItemClickListener事件则为当鼠标单击时,所触发的事件.由此可以区别出list中的"选择"与&q

  • Android中home键和back键区别实例分析

    本文实例分析了Android中home键和back键区别.分享给大家供大家参考.具体如下: back键 Android的程序无需刻意的去退出,当你一按下手机的back键的时候,系统会默认调用程序栈中最上层Activity的Destroy()方法来销毁当前Activity,当此Activity又被其它Activity启动起来的时候,会重新调用OnCreate()方法进行创建,当栈中所有Activity都弹出结束后,应用也就随之结束了.如果说程序中存在service之类的,则可以在恰当的位置监听处理

  • Android开发中PopupWindow用法实例分析

    本文实例分析了Android开发中PopupWindow用法.分享给大家供大家参考,具体如下: private TextView tv_appmanager_title; private ListView lv_app_manager; private LinearLayout ll_appmanager_loading; private AppManagerProvider provider; private List<AppManagerInfo> infos ; private AppM

  • Android中ListActivity用法实例分析

    本文实例分析了Android中ListActivity用法.分享给大家供大家参考,具体如下: 程序如下: import android.app.ListActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ArrayAdapter; import android.widge

  • Android中AlertDialog用法实例分析

    本文实例分析了Android中AlertDialog用法,分享给大家供大家参考,具体如下: Android中AlertDialog为一些程序提供了对话框,有些功能能够进一步满足程序的需要.下面举例介绍. 程序如下: import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.

随机推荐