- 浏览: 341316 次
- 性别:
- 来自: 广州
文章分类
最新评论
一:问题
几乎所有的应用程序都有一些系统常量需要存储在程序外部,一个常见的做法是使用一个配置文件存储这些常量,这样,一旦常量有变化的话,无需修改程序代码就可以重新配置一个系统。在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 2927import com.sun.swing.internal. ... -
面试经典
2014-05-24 09:29 6431.mysql innodb引擎,什么叫聚集索引,与非聚集索 ... -
一拍网网站系统架构图
2014-03-28 21:24 623一拍网网站系统架构图 -
Window下安装配置nginx
2013-08-12 16:53 809安装:http://www.cnblogs.com/wen ... -
使用线程池的好处
2013-07-18 14:41 1252使用线程池有两个好处: 1.可以创建和销毁线程所带来的系统 ... -
Java ThreadLocal使用浅析
2013-07-18 14:36 483ThreadLocal通过在其内部保存变量的副本,并且各个副本 ... -
MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
2013-07-05 13:06 1177http://blog.csdn.net/zhangwei ... -
分享一位网友的架构杂谈
2013-05-20 23:16 913不容类型的网站,并发处理不一样,例如针对sns这种类型的网站 ... -
JSP页面静态化
2013-04-08 09:20 890http://www.java-zone.org/644.ht ... -
Java compile to C++
2013-03-19 14:53 507http://code.google.com/a/eclips ... -
几个TCP Socket的通信框架
2013-03-19 12:26 996http://www.oschina.net/p/simple ... -
宝贝鱼
2013-03-18 23:54 692http://code.google.com/p/cshbbr ... -
将Java程序注册成系统服务(NT服务)
2013-03-16 16:14 604http://blog.csdn.net/small____f ... -
Java内存回收机制
2013-03-13 15:47 814http://www.iteye.com/blogs/tag/ ... -
支付宝,百付宝集成
2013-03-13 14:01 975http://help.alipay.com/support/ ... -
SSH+EXTJS项目下载
2013-03-11 23:02 437http://download.csdn.net/tag/Ex ... -
Hibernate中使用Threadlocal创建线程安全的Session
2013-03-04 20:39 592http://blog.sina.com.cn/s/blog_ ... -
Java Socket多线程通信
2012-10-09 09:53 839当Server没接受到一个Client连接请求之后,都把处理流 ... -
Java 多线程的一个例子
2012-10-09 09:48 1024目录: 1 synchronized的 ... -
app引擎
2012-07-10 09:39 0http://sae.sina.com.cn/ htt ...
相关推荐
今天我们要探讨的是JAVA设计中的两个重要模式:抽象类与适配器模式。 首先,我们来理解一下“抽象”。抽象是面向对象编程的核心概念之一,它帮助我们处理对象的复杂性。在Java中,抽象通常通过抽象类来实现。抽象类...
4. **设备驱动程序**:硬件设备通常有自己的驱动接口,适配器模式可以让操作系统与不同硬件设备进行通信。 在选择类适配器还是对象适配器时,需要考虑Adaptee接口数量和与目标接口的契合度。如果Adaptee接口多且...
4. 使用适配器:客户端代码通过目标接口与适配器交互,适配器内部完成实际的转换逻辑。 在`DesignMode_Adapter`这个压缩包文件中,可能包含了相关的C++源码示例,演示了如何创建和使用适配器模式。这些源码可能包括...
适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在解决系统间的兼容性和接口不匹配问题时。适配器模式的核心思想是将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容而无法...
1. 类适配器:适配器类继承自目标接口,并且包含一个被适配类的实例。 2. 对象适配器:适配器类通过组合的方式包含被适配类的引用,而不是继承。 二、适配器模式的结构 适配器模式主要涉及四个角色: - 目标接口...
适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在本实验中,我们将深入探讨适配器模式的概念、应用场景以及如何在实际编程中实现它。适配器模式通常分为类适配器和对象适配器两种形式。 ...
在软件工程中,这种模式常被用来解决旧系统与新系统、第三方库或者不同组件之间的接口不匹配问题。适配器模式的核心思想是通过创建一个新的类(适配器),将原有接口转换成目标接口,使得原本无法一起工作的类可以...
适配器模式可以分为三种类型:类适配器模式、对象适配器模式和接口适配器模式。 类适配器模式中,适配器类通过继承适配者类并实现目标接口来实现适配。例如,在手机充电的例子中,充电器(VoltageAdapter)继承了...
文件列表中的"adapter"可能包含了适配器模式的Java源代码文件,这些文件通常会包含以上提到的三个角色的定义。例如,可能会有`Target.java`(目标接口),`Adaptee.java`(被适配者类),以及`Adapter.java`(类...
8. **适配器模式与其他设计模式的关系**:比较适配器模式与装饰者模式、代理模式等其他设计模式的异同。 9. **案例分析**:通过实际案例演示如何在项目中使用适配器模式,帮助理解其实际应用。 10. **设计原则**:...
此外,适配器模式也是解决遗留系统与新系统之间接口不匹配问题的有效手段。在阅读和分析这个源码时,可以关注适配器类如何通过方法映射和调用来实现接口的转换,以及如何在不修改原有类的基础上,实现功能的扩展。 ...
- 类适配器:适配器类继承目标接口并包含对Adaptee的引用。这种方式要求Adaptee是一个类,因为C#不支持多继承。 ```csharp public class TargetInterface { public void NewMethod(); } public class Adaptee { ...
- 在实际开发中,适配器模式不仅仅局限于类与类之间的适配,还可以应用于对象与接口、接口与接口的适配,甚至在跨语言交互、不同框架集成等场景中发挥作用。 通过理解适配器模式的基本原理和应用,我们可以更好地...
4. 使用适配器:新系统中的代码通过适配器类与旧接口进行交互。 在“Adapter”这个压缩包文件中,可能包含了关于适配器模式的示例代码或者更详细的解释。通过阅读这些文件,可以更好地理解和应用适配器模式。适配器...
适配器模式的核心思想是“包装”(wrapping),它通过创建一个新的类,这个新类将作为原有类与新接口之间的桥梁。适配器模式主要有两种形式:类适配器和对象适配器。 1. **类适配器模式**: 在类适配器模式中,...
例如,在软件开发中,当需要将一个第三方库的API与自己项目中的接口进行对接时,适配器模式可以帮助我们平滑过渡,减少对接带来的复杂性。 在实际应用中,适配器模式可能涉及的步骤包括: 1. 确定目标接口,这是...
在Java中,适配器模式广泛应用于系统集成、旧代码复用以及第三方库的兼容性问题。 适配器模式主要有两种形式:类适配器模式和对象适配器模式。类适配器模式是通过继承目标接口(需要适配的接口)和被适配类(原始不...