- 浏览: 328145 次
- 性别:
- 来自: 广州
文章分类
最新评论
一:问题
几乎所有的应用程序都有一些系统常量需要存储在程序外部,一个常见的做法是使用一个配置文件存储这些常量,这样,一旦常量有变化的话,无需修改程序代码就可以重新配置一个系统。在Java编程里,一个配置文件就是.properties文件或者XML文件。使用.properties文件虽然是现行工业标准,但正在渐渐被XML文件所取代,一个配置文件所需要的无非就是存储一些代码和代码所代表的值组成的对,即key-value对,如.properties配置文件的内容代码清单:
使用XML文件是一个好主意,唯一不足的是读取XML文件不像读取.properties文件那样容易,因为Java语言为.properties文件准备了java.util.Properties类,那么可不可以自己提供一个读取XML配置文件的工具类呢?当然可以。如果是单纯读取XML文件的话,事情并不复杂,但是有一些已经开发完成的系统已经使用了.properties文件,将.properties文件更换为.xml文件的话就要修改读取配置文件的代码,这就不符合软件设计的"开-闭"原则.那么能否在将.properties文件更换为.xml文件的同时不修改代码呢?当然可以。如果使用适配器模式的话是可以做到这一点的.假设这个类叫做XMLProperties,那么XMLProperties需要能读取XML文件,但是提供给客户端的是一个Properties类型。换言之,XMLProperties将XML接口适配成java.util.Properties类型.
如果你不熟悉SAX2(Simple API for XML),我为你额外提供了XML和SAX2教程的快照.(关于SAX2的事件处理请参巧观察者模式与SAX2浏览器一章)
二:SAX2浏览器
(A)SAX2是什么
SAX是Simple API for XML的缩写,它是一个通用的为各种不同的XML浏览器而设计的接口,就像jdbc是为各种不同的数据库而设计的接口一样。使用SAX接口而不是直接使用XML浏览器本身,可以避免使应用程序依赖于这种XML浏览器.与DOM比较而言,SAX是一种轻量型的方法,在处理DOM时需要读入整个XML文件,然后在内存中创建DOM的树结构,包括生成DOM树上的每个节点对象。当文件比较小时,这不会造成什么问题,但是一旦文件大起来,处理DOM就会耗费相当大的资源。这时候,一个很好的办法就是使用SAX。
不同于DOM的文档驱动,SAX是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程,所谓事件驱动,就是java1.1所提出的委派事件模型机制.
XMLReader读入文档的过程和解析的过程是同时进行的,解析开始之前,需要向XMLReader注册一个ContentHandler,也就是相当于一个事件监听器,在ContentHandler中定义了很多事件方法,作为对遇到一个XML标识符事件的相应方法,比如startDocument(),它定义了在解析过程中遇到文档开始时采取的操作,当XMLReader读到合适的内容时,就会抛出相应的事件,并把这个事件的处理权委派给ContentHandler,而后者则调用相应的方法作为响应.
你可以去下载org.apache.xeroes.parsers.SAXParser这个驱动包
下面是一个读取XML文件的例子:
三:下面开始解决"一"中提到的问题
本项目的目的是使用适配器模式将DocumentHandler的接口适配成java.util.Properties的接口.在这里采取对象的适配器模式,XMLProperties是一个继承自java.util.Properties的对象,并委派一个DocumentHandler类型的对象.这就是说,本项目需要两个新类--XMLProperties类和XMLParser类,前者的类型是java.util.Properties,后者的类型是DocumentHandler。
390---用SAX解释xml的源码。很不错! (在此略过,遇到问题,如何初始化XMLParser)
几乎所有的应用程序都有一些系统常量需要存储在程序外部,一个常见的做法是使用一个配置文件存储这些常量,这样,一旦常量有变化的话,无需修改程序代码就可以重新配置一个系统。在Java编程里,一个配置文件就是.properties文件或者XML文件。使用.properties文件虽然是现行工业标准,但正在渐渐被XML文件所取代,一个配置文件所需要的无非就是存储一些代码和代码所代表的值组成的对,即key-value对,如.properties配置文件的内容代码清单:
name=milenfan website=www.milenfan.com email=jyumath_Milenfan@163.com 如果将此配置文件改写成XML文件的话,代码如下: <property name="name"> milenfan </property> <property name="website"> www.milenfan.com </property> <property name="email"> jyumath_milenfan@163.com </property>
使用XML文件是一个好主意,唯一不足的是读取XML文件不像读取.properties文件那样容易,因为Java语言为.properties文件准备了java.util.Properties类,那么可不可以自己提供一个读取XML配置文件的工具类呢?当然可以。如果是单纯读取XML文件的话,事情并不复杂,但是有一些已经开发完成的系统已经使用了.properties文件,将.properties文件更换为.xml文件的话就要修改读取配置文件的代码,这就不符合软件设计的"开-闭"原则.那么能否在将.properties文件更换为.xml文件的同时不修改代码呢?当然可以。如果使用适配器模式的话是可以做到这一点的.假设这个类叫做XMLProperties,那么XMLProperties需要能读取XML文件,但是提供给客户端的是一个Properties类型。换言之,XMLProperties将XML接口适配成java.util.Properties类型.
如果你不熟悉SAX2(Simple API for XML),我为你额外提供了XML和SAX2教程的快照.(关于SAX2的事件处理请参巧观察者模式与SAX2浏览器一章)
二:SAX2浏览器
(A)SAX2是什么
SAX是Simple API for XML的缩写,它是一个通用的为各种不同的XML浏览器而设计的接口,就像jdbc是为各种不同的数据库而设计的接口一样。使用SAX接口而不是直接使用XML浏览器本身,可以避免使应用程序依赖于这种XML浏览器.与DOM比较而言,SAX是一种轻量型的方法,在处理DOM时需要读入整个XML文件,然后在内存中创建DOM的树结构,包括生成DOM树上的每个节点对象。当文件比较小时,这不会造成什么问题,但是一旦文件大起来,处理DOM就会耗费相当大的资源。这时候,一个很好的办法就是使用SAX。
不同于DOM的文档驱动,SAX是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程,所谓事件驱动,就是java1.1所提出的委派事件模型机制.
XMLReader读入文档的过程和解析的过程是同时进行的,解析开始之前,需要向XMLReader注册一个ContentHandler,也就是相当于一个事件监听器,在ContentHandler中定义了很多事件方法,作为对遇到一个XML标识符事件的相应方法,比如startDocument(),它定义了在解析过程中遇到文档开始时采取的操作,当XMLReader读到合适的内容时,就会抛出相应的事件,并把这个事件的处理权委派给ContentHandler,而后者则调用相应的方法作为响应.
你可以去下载org.apache.xeroes.parsers.SAXParser这个驱动包
下面是一个读取XML文件的例子:
package cai.milenfan.basic.test; import java.io.FileReader; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.XMLReaderFactory; public class MySAXApp extends DefaultHandler{ public MySAXApp(){ super(); } public static void main(String[] args)throws Exception{ XMLReader xr = XMLReaderFactory.createXMLReader(); MySAXApp handler = new MySAXApp(); //把MySAXApp的一个实例登记到XMLReader里,以接收正常的内宾事件和出错事件,还可以登记其他事件 xr.setContentHandler(handler); xr.setErrorHandler(handler); FileReader fr = new FileReader(args[0]); xr.parse(new InputSource(fr)); } //开始读xml时触发的方法 public void startDocument(){ System.out.println(".................startDocument"); } //读取xml完毕时触发的方法 public void endDocument(){ System.out.println(".................endDocument"); } //SAX2遇到普通的character数据时会通过character方法报告给客户端 public void character(char ch[],int start,int length){ System.out.println(".................character"); for(int i=start;i<start + length;i++){ System.out.println(ch[i]); } } }
三:下面开始解决"一"中提到的问题
本项目的目的是使用适配器模式将DocumentHandler的接口适配成java.util.Properties的接口.在这里采取对象的适配器模式,XMLProperties是一个继承自java.util.Properties的对象,并委派一个DocumentHandler类型的对象.这就是说,本项目需要两个新类--XMLProperties类和XMLParser类,前者的类型是java.util.Properties,后者的类型是DocumentHandler。
390---用SAX解释xml的源码。很不错! (在此略过,遇到问题,如何初始化XMLParser)
发表评论
-
Mina重连
2014-05-26 21:29 2865import com.sun.swing.internal. ... -
面试经典
2014-05-24 09:29 6081.mysql innodb引擎,什么叫聚集索引,与非聚集索 ... -
一拍网网站系统架构图
2014-03-28 21:24 539一拍网网站系统架构图 -
Window下安装配置nginx
2013-08-12 16:53 736安装:http://www.cnblogs.com/wen ... -
使用线程池的好处
2013-07-18 14:41 1142使用线程池有两个好处: 1.可以创建和销毁线程所带来的系统 ... -
Java ThreadLocal使用浅析
2013-07-18 14:36 414ThreadLocal通过在其内部保存变量的副本,并且各个副本 ... -
MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
2013-07-05 13:06 1091http://blog.csdn.net/zhangwei ... -
分享一位网友的架构杂谈
2013-05-20 23:16 873不容类型的网站,并发处理不一样,例如针对sns这种类型的网站 ... -
JSP页面静态化
2013-04-08 09:20 805http://www.java-zone.org/644.ht ... -
Java compile to C++
2013-03-19 14:53 464http://code.google.com/a/eclips ... -
几个TCP Socket的通信框架
2013-03-19 12:26 947http://www.oschina.net/p/simple ... -
宝贝鱼
2013-03-18 23:54 638http://code.google.com/p/cshbbr ... -
将Java程序注册成系统服务(NT服务)
2013-03-16 16:14 571http://blog.csdn.net/small____f ... -
Java内存回收机制
2013-03-13 15:47 782http://www.iteye.com/blogs/tag/ ... -
支付宝,百付宝集成
2013-03-13 14:01 898http://help.alipay.com/support/ ... -
SSH+EXTJS项目下载
2013-03-11 23:02 387http://download.csdn.net/tag/Ex ... -
Hibernate中使用Threadlocal创建线程安全的Session
2013-03-04 20:39 490http://blog.sina.com.cn/s/blog_ ... -
Java Socket多线程通信
2012-10-09 09:53 811当Server没接受到一个Client连接请求之后,都把处理流 ... -
Java 多线程的一个例子
2012-10-09 09:48 984目录: 1 synchronized的 ... -
app引擎
2012-07-10 09:39 0http://sae.sina.com.cn/ htt ...
相关推荐
为三类: 类适配器模式、 对象适配器模式、 接口适配器模式。 以生活中手机充电为例来讲解适配器模式, 手机本身并不能直接用220V交流电, 需要将220V的交流电转换为5V的直流电, 在这个过程 中, 充电器本身相当于...
实验七:适配器模式.rar实验七:适配器模式.rar
* 适配器模式,适配现有的类与方法,最终产出的是满足需求的新的接口方法 * 特点:复用现有的类 * * 实现流程: * 被适配的类,组合进适配器内部 * 适配器实现接口内部方法,调用被适配的方法后,进行逻辑...
除此之外,在文章的最后,我还对代理、桥接、装饰器、适配器,这 4 种代码结构非常相似的设计模式做简单的对比,对这几节内容做一个简单的总结。顾名思义,这个模式就是
什么是抽象:抽象是处理对象复杂性的一种技术,它只关注对象的主要细节而忽略了对象的次要细节。
C#面向对象设计模式纵横谈(7):Adapter 适配器模式(结构型模式) 体验课程
设计模式之适配器模式Java版 设计模式之适配器模式Java版 设计模式之适配器模式Java版 设计模式之适配器模式Java版
适配器模式的Java实现版本,包含类适配器模式和对象适配器模式的实现,同时也包含两者的UML类图
C#面向对象设计模式纵横谈(7):Adapter 适配器模式(结构型模式) (Level 300)
C#设计模式之适配器模式应用实例
java设计模式之适配器模式,希望对大家有所帮助。
实验7 适配器模式、外观模式与模板方法模式---Java设计模式
- 类适配器:适配器和适配者之间通常通过继承(或实现)关系来实现。 - 对象适配器:适配器和适配者之间是关联关系。 4. **优点**: - 提高类的复用性,无需修改原有代码即可重用现有适配者类。 - 将目标类和适配者...
动态代理模式 适配器模式 实现,都可以运行,有一部分注解
适配器模式代码demo 适配器模式代码demo 适配器模式代码demo
该资源是学习完设计模式的适配器模式与外观模式根据书中内容所写的demo
1. 适配器模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。 2. 适配器模式有对象适配器和类适配器两种形式的实现结构,但是类适配器...
[刚刚上传的demo运行有问题,重新传了个新的],这个的一个iOS的适配器模式的实例代码,目前就是一个简单的demo,后期还会更新适配器在 MVC,MVP,MVVM中的使用,demo对应着简书:https://www.jianshu.com/p/e2ebcf19098f,...