模式开发—运用配置文件和反射机制重构客户端代码
2017-01-02 11:57
531 查看
问题引入:我们在开发软件时,往往因为需求,要频繁的修改源码,在不违背开发原则(单一职责、开放封闭……..)的情况下,往往需要增加功能抽象接口或具体的实现类,而客户端就要相应的修改。
为了让系统具有更好的灵活性和扩展性,使得在不修改任何客户端的代码的基础上,更换新的功能实现。
以工厂方法模式为例:
解决办法:客户端代码中不再使用new关键字来创建工厂对象,将具体工厂类的类名存储在配置文件(如XML)中,通过读取配置文件获取类名字符串,使用Java反射机制,根据类名字符串生成对象。
config.xml
XMLUtil.java
此时客户端代码便可以如下:
引入XMLUtil类和XML配置文件后,如果要新增日志记录方式,只需增加新的具体产品与具体工厂,根据客户端的需求修改相应的config.xml文件,客户端代码无需做任何修改
其他模式的学习,完全可以按照上面的方法,通过重用XMLUtil类,来简化设计
为了让系统具有更好的灵活性和扩展性,使得在不修改任何客户端的代码的基础上,更换新的功能实现。
以工厂方法模式为例:
/** *@Descriptio0n 工厂方法模式 *@Time 20170-01-01 */ interface Logger{ //抽象产品 public void writeLog(); } class FileLogger implements Logger{ //具体产品1文件日志记录器 public void writeLog(){ System.out.println("文件日志"); } } class DatabaseLogger implements Logger{//具体产品2数据库日志文件记录器 public void writeLog(){ System.out.println("数据库日志"); } } interface LoggerFactory{//抽象工厂 public Logger createLogger(); } class FileLoggerFactory implements LoggerFactory{//具体工厂1 public Logger createLogger(){ return new FileLogger(); } } class DatabaseLoggerFactory implements LoggerFactory{//具体工厂2 public Logger createLogger(){ return new DatabaseLogger(); } } class Client{ //客户端代码 public static void main(String[] args){ LoggerFactory fac; fac = new FileLoggerFactory(); //引入配置文件进行管理 fac.createLogger().writeLog(); } }
解决办法:客户端代码中不再使用new关键字来创建工厂对象,将具体工厂类的类名存储在配置文件(如XML)中,通过读取配置文件获取类名字符串,使用Java反射机制,根据类名字符串生成对象。
config.xml
<!---config.xml-> <?xml version="1.0"?> <config> <className>FileLoggerFactory</className> </config>
XMLUtil.java
//工具类XMLUtil.java import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.SAXException; import java.io.*; public class XMLUtil{ public static Object getBean(){ try{ DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("config.xml")); NOdeList nl = doc.getElementByTagName("className"); Node classNode = nl.item(0).getFirstChild(); String cName = classNode.getNOdeValue(); //通过类名生成实例对象并将其返回 Class c = Class.forName(cName); Object obj = c.newInstance(); return obj; } catch(Exception e){ e.printStackTrace(); return null; } } }
此时客户端代码便可以如下:
class Client{ //客户端代码 public static void main(String[] args){ LoggerFactory fac; fac = (LoggerFactory)XMLUtil.getBean(); //引入配置文件进行管理 fac.createLogger().writeLog(); } }
引入XMLUtil类和XML配置文件后,如果要新增日志记录方式,只需增加新的具体产品与具体工厂,根据客户端的需求修改相应的config.xml文件,客户端代码无需做任何修改
其他模式的学习,完全可以按照上面的方法,通过重用XMLUtil类,来简化设计
相关文章推荐
- 反射机制与配置文件结合的工厂设计模式
- [Java 15 反射机制 ] 工厂模式与 properties 读取配置文件
- 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
- PHP Strom 配置less 并设置编译后在远程开发模式下自动上传css文件
- PHP Strom 配置less 并设置编译后在远程开发模式下自动上传css文件
- WCF 安全机制 客户端和服务端配置文件
- FastDFS的配置、部署与API使用解读(2)以字节方式上传文件的客户端代码
- FastDFS的配置、部署与API使用解读(3)以流的方式上传文件的客户端代码
- 设计模式之反射与配置文件
- Myeclipse开发JSP 代码和配置文件位置
- 【SSH进阶之路】一步步重构容器实现Spring框架——配置文件+反射实现IoC容器(十)
- FastDFS的配置、部署与API使用解读(2)以字节方式上传文件的客户端代码
- CXF客户端配置请求超时限制-SocketTimeoutException(Spring配置文件中配置和通过代码进行配置)
- java工厂模式的学习,与反射机制相、外部配置相结合
- rcp(插件开发) 去掉plugin_customization.ini文件,在代码中实现配置功能
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端配置文件简化,简单简单再简单
- 设计模式之反射与配置文件
- IOS开发 消息推送机制和流程以及客户端和服务器代码
- 用反射机制简单应用配置文件
- 【iOS开发-2】Info.plist文件的初步窥探:如何增减配置以及如何用代码调用里面的值