Java私塾:研磨设计模式 之 解释器模式(Interpreter)1
2013-12-06 09:43
756 查看
21.1 场景问题
21.1.1 读取配置文件
考虑这样一个实际的应用,维护系统自定义的配置文件。几乎每个实际的应用系统都有与应用自身相关的配置文件,这个配置文件是由开发人员根据需要自定义的,系统运行时会根据配置的数据进行相应的功能处理。 系统现有的配置数据很简单,主要是JDBC所需要的数据,还有默认读取Spring的配置文件,目前系统只需要一个Spring的配置文件。示例如下:<?xml version="1.0" encoding="UTF-8"?><root> <jdbc> <driver-class>驱动类名</driver-class> <url>连接数据库的URL</url> <user>连接数据库的用户名</user> <password>连接数据库的密码</password> </jdbc> <application-xml>缺省读取的Spring配置的文件名称</application-xml></root> |
21.1.2 不用模式的解决方案
不就是读取配置文件吗?实现很简单,直接读取并解析xml就可以了。读取xml的应用包很多,这里都不用,直接采用最基础的Dom解析就可以了。另外,读取到xml中的值过后,后续如何处理,这里也不去管,这里只是实现把配置文件读取并解析出来。 按照这个思路,很快就写出了实现的代码,示例代码如下:/** * 读取配置文件 */public class ReadAppXml { /** * 读取配置文件内容 * @param filePathName 配置文件的路径和文件名 * @throws Exception */ public void read(String filePathName)throws Exception{ Document doc = null; //建立一个解析器工厂 DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance(); //获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器 DocumentBuilder builder=factory.newDocumentBuilder(); //得到一个表示XML文档的Document对象 doc=builder.parse(filePathName); //去掉XML中作为格式化内容的空白而映射在DOM树中的Text Node对象 doc.normalize(); //获取jdbc的配置值 NodeList jdbc = doc.getElementsByTagName("jdbc"); //只有一个jdbc,获取jdbc中的驱动类的名称 NodeList driverClassNode = ((Element)jdbc.item(0)).getElementsByTagName("driver-class"); String driverClass = driverClassNode.item(0).getFirstChild().getNodeValue(); System.out.println("driverClass=="+driverClass); //同理获取url、user、password等的值 NodeList urlNode = ((Element)jdbc.item(0)).getElementsByTagName("url"); String url=urlNode.item(0).getFirstChild().getNodeValue(); System.out.println("url=="+url); NodeList userNode = ((Element)jdbc.item(0)).getElementsByTagName("user"); String user = userNode.item(0).getFirstChild().getNodeValue(); System.out.println("user=="+user); NodeList passwordNode = ((Element)jdbc.item(0)).getElementsByTagName("password"); String password = passwordNode.item(0).getFirstChild().getNodeValue(); System.out.println("password=="+password); //获取application-xml NodeList applicationXmlNode =doc.getElementsByTagName("application-xml"); String applicationXml = applicationXmlNode.item(0).getFirstChild().getNodeValue(); System.out.println("applicationXml=="+applicationXml); }} |
21.1.3 有何问题
看了上面的实现,多简单啊,就是最基本的Dom解析嘛,要是采用其它的开源工具包,比如dom4j、jDom之类的来处理,会更简单,这好像不值得一提呀,真的是这样吗?请思考一个问题:如果配置文件的结构需要变动呢?仔细想想,就会感觉出问题来了。还是先看例子,然后再来总结这个问题。随着开发的深入进行,越来越多可配置的数据被抽取出来,需要添加到配置文件中,比如与数据库的连接配置:就加入了是否需要、是否使用DataSource等配置。除了这些还加入了一些其它需要配置的数据,例如:系统管理员、日志记录方式、缓存线程的间隔时长、默认读取哪些Spring配置文件等等,示例如下:<?xml version="1.0" encoding="UTF-8"?><root> <database-connection> <connection-type>连接数据库的类型,1-用Spring集成的方式(也就是不用下面两种方式了),2-DataSource(就是使用JNDI),3-使用JDBC自己来连接数据库 </connection-type> <jndi>DataSource的方式用,服务器数据源的JNDI名称</jndi> <jdbc>跟上面一样,省略了</jdbc> </database-connection> <system-operator>系统管理员ID</system-operator> <log> <operate-type>记录日志的方式,1-数据库,2-文件</operate-type> <file-name>记录日志的文件名称</file-name> </log> <thread-interval>缓存线程的间隔时长</thread-interval> <spring-default> <application-xmls> <application-xml>缺省读取的Spring配置的文件名称 </application-xml> <application-xml>其它需要读取的Spring配置的文件名称 </application-xml> </application-xmls> </spring-default></root> |
//获取application-xml NodeList applicationXmlNode =doc.getElementsByTagName("application-xml"); String applicationXml = applicationXmlNode.item(0).getFirstChild().getNodeValue(); System.out.println("applicationXml=="+applicationXml); |
//先要获取spring-default,然后获取application-xmls //然后才能获取application-xml NodeList springDefaultNode =doc.getElementsByTagName("spring-default"); NodeList appXmlsNode = ((Element)springDefaultNode.item(0)).getElementsByTagName("application-xmls"); NodeList appXmlNode = ((Element)appXmlsNode.item(0)).getElementsByTagName("application-xml"); //循环获取每个application-xml元素的值 for(int i=0;i<appXmlNode.getLength();i++){ String applicationXml = appXmlNode.item(i).getFirstChild().getNodeValue(); System.out.println("applicationXml=="+applicationXml); } |
相关文章推荐
- Java私塾:研磨设计模式 之 解释器模式(Interpreter)3
- 设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 解释器模式(Interpreter) - Java实现
- Java私塾:研磨设计模式 之 装饰模式(Decorator)3
- Java开发中的23种设计模式之二十三:解释器模式(Interpreter)
- Java私塾:研磨设计模式 之 访问者模式(Visitor)
- Java设计模式--解释器模式【Interpreter Pattern】
- JAVA设计模式(22):行为型-解释器模式(Interpreter)
- JAVA设计模式十五:--Interpreter(解释器模式)
- JAVA设计模式(23) —<行为型>解释器模式(Interpreter)
- Java开发中的23种设计模式详解----解释器模式(Interpreter)
- JAVA设计模式(22):行为型-解释器模式(Interpreter)
- Java设计模式之从[计算器]分析解释器(Interpreter)模式
- 浅谈Java设计模式(二十三)解释器模式(Interpreter)
- java设计模式23——解释器模式(Interpreter)
- Java设计模式十四:解释器模式(Interpreter)
- 设计模式学习笔记--解释器模式Interpreter与访问者模式Visitor(Java版)
- java设计模式-解释器模式(Interpreter)
- 【设计模式 java】——解释器模式(Interpreter)
- 研磨设计模式 之 解释器模式(Interpreter)2——跟着cc学设计系列
- Java设计模式-解释器模式(Interpreter)