目录
什么是xml建模?
XML建模是指使用XML来描述和组织数据结构的过程。XML是一种通用的标记语言,它可以用于描述各种类型的数据,如文本、图像、音频和视频等。在XML中,可以定义元素、属性、命名空间等概念来组织数据,从而形成有层次结构的数据模型。
XML建模主要包括两个方面:DTD和XML Schema。DTD是一种简单的文本文件,用于定义XML文档中允许出现的元素、属性和实体等,它是XML建模的一种基本方式。XML Schema是一种更为严格和功能更强大的建模方式,它基于XML语法,提供了一组结构定义和数据类型定义,用于强制检查XML文档的结构和数据类型。
XML建模的优点
可扩展性和灵活性:XML的结构可以根据需要进行扩展和修改,以适应不同的应用场景。
易于处理和解析:XML的结构清晰明了,易于程序处理和解析,可以有效地进行数据交换和存储。
通用性和互操作性:XML是一种标准的、平台无关的数据格式,可以用于不同的应用程序、系统和平台之间进行数据交换和共享。
XML建模的作用
XML建模的主要作用是用于存储、传输和表示数据。它提供了一种通用的、可扩展的数据格式,可以用于描述各种类型的数据,如文本、图像、音频和视频等。通过定义标签和属性,XML可以将数据结构化,便于程序处理和解析。
XML建模还可以用于数据交换和互操作性,因为XML是一种标准的、平台无关的数据格式。不同的应用程序、系统和平台都可以使用XML来交换数据,从而实现数据的共享和集成。
此外,XML建模还可以用于Web开发中的数据传输和表示。许多Web服务都使用XML作为数据格式进行通信,例如SOAP和RESTful服务等。同时,XML也是许多Web页面中用于描述内容和样式的标记语言的基础,如HTML、SVG和MathML等。
一.xml建模的思路
1、分析需要被建模的文件中有几个对象
2、每个对象拥有的行为(比如增删改查)以及属性
3、定义对象从小到大(从里到外)
4、通过23种的设计模式中的工厂模式,解析xml生产出指定对象
5.好处:提高代码的复用性
二.xml建模应用
2.1XML建模应用方式
XML建模广泛应用于各种数据交换和存储场景中,其应用方式主要包括以下几种:
数据交换:XML建模可以用于不同系统和应用程序之间进行数据交换和传输,以实现数据的统一格式和结构。其应用范围涵盖了各种行业、领域和应用场景,如电子商务、金融服务、医疗保健、制造业等。
数据存储:XML建模可以用于将数据存储到XML文件或数据库中,以实现数据的持久化和管理。开发人员可以使用XML建模定义数据模型和存储格式,以便于后续的数据访问、查询和分析。
应用集成:XML建模可以用于不同应用程序和系统之间进行集成,以实现数据的共享和协同处理。其应用范围涵盖了各种企业应用,如ERP、CRM、SCM等。
Web服务:XML建模可以用于描述Web服务中的数据格式和交换协议,以实现不同Web服务之间的互操作和集成。其应用范围涵盖了各种Web应用和互联网服务,如电子邮件、电子商务、社交网络等。
总之,XML建模的应用方式可以根据具体的场景和需求进行灵活地调整和定制,以实现最佳的数据交换和存储效果。
XML建模可以采用面向对象方式来描述数据模型。在面向对象方式中,可以使用XML元素来表示类,使用XML属性来表示类的属性,使用XML子元素来表示类的关系。
以config.xml为例子:
面向对象思考的步骤:
1. 在configModel中添加actionModel,就要有个容器来装载actionModel,又因为axtionModel是唯一值,所有这个容器就为 (Map集合);
2. actionModel中添加forwordModel,用Map容器来装载;
3. 在actionModel中还有属性 path,type;
4. 在forwordModel中有属性 name,path,redirect ;
所有这里需要注意实现时从小到大(从里到外)
这里的实现顺序为 forwordModel----actionModel----configModel---ConfigmodelFactory
ConfigmodelFactory 包为工厂模式
forwordModel包:
package com.liaozzhixiang.Model;
public class ForwardModel {
private String name;
private String path;
private boolean redirect;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public boolean isRedirect() {
return redirect;
}
public void setRedirect(boolean redirect) {
this.redirect = redirect;
}
}
actionModel:
package com.liaozzhixiang.Model;
import java.util.HashMap;
import java.util.Map;
public class ActionModel {
private String path;
private String type;
private Map<String, ForwardModel> fmap= new HashMap<String, ForwardModel>();
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
//压栈
public void push(ForwardModel ForwardModel) {
fmap.put(ForwardModel.getName(), ForwardModel);
}
//弹栈
public ForwardModel pop(String name) {
return fmap.get(name);
}
}
configModel包:
package com.liaozzhixiang.Model;
import java.util.HashMap;
import java.util.Map;
public class Configmodel {
private Map<String, ActionModel> amap = new HashMap<String, ActionModel>();
public void push(ActionModel ActionModel) {
amap.put(ActionModel.getPath(), ActionModel);
}
//压栈
public ActionModel pop(String path) {
return amap.get(path);
}
public static void main(String[] args) throws Exception {
Configmodel configmodel= ConfigmodelFactory.build();
ActionModel actionModel = configmodel.pop("/loginAction");
ForwardModel forwardModel = actionModel.pop("success");
System.out.println(forwardModel.getPath());
}
}
ConfigmodelFactory 包
package com.liaozzhixiang.Model;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 知识点 23种的设计模式中的工厂模式
* @author Administrator
*
*/
public class ConfigmodelFactory {
/**
* 创建并构建 ConfigModel 对象
* @return Configmodel 配置模型对象
* @throws Exception 执行过程中抛出的异常
*/
public static Configmodel build() throws Exception {
Configmodel configmodel = new Configmodel();
// 获取 config.xml 文件的输入流
InputStream in = ConfigmodelFactory.class.getResourceAsStream("/config.xml");
// 创建 XML 解析器 SAXReader
SAXReader sr = new SAXReader();
// 使用 SAXReader 解析 XML 文件,得到 Document 对象
Document doc = sr.read(in);
// 获取所有 action 元素的列表,并依次处理
List<Element> actioneles = doc.selectNodes("/config/action");
for (Element actionele : actioneles) {
// 创建 ActionModel
ActionModel actionModel = new ActionModel();
// 获取 action 元素的 path 和 type 属性,并设置到 ActionModel 对象中
actionModel.setPath(actionele.attributeValue("path"));
actionModel.setType(actionele.attributeValue("type"));
// 获取当前 action 元素下的所有 forward 元素的列表,并依次处理
List<Element> forwardEles = actionele.selectNodes("forward");
for (Element forwardEle : forwardEles) {
// 创建ForwardModel
ForwardModel forwardmodel = new ForwardModel();
// 获取 forward 元素的 name 和 path 属性,并设置到 ForwardModel 对象中
forwardmodel.setName(forwardEle.attributeValue("name"));
forwardmodel.setPath(forwardEle.attributeValue("path"));
// 设置 ForwardModel 对象的 redirect 属性
forwardmodel.setRedirect(!"false".equals(forwardEle.attributeValue("redirect")));
// 将 ForwardModel 对象添加到 ActionModel 对象的 forwardModels 列表中
actionModel.push(forwardmodel);
}
// 将 ActionModel 对象添加到 Configmodel 对象的 actionModels 列表中
configmodel.push(actionModel);
}
// 返回构建好的 Configmodel 对象
return configmodel;
}
public static void main(String[] args) throws Exception {
ConfigmodelFactory.build();
}
}
在Configmodel中解析并且拿到xml生产出指定对象:
三.工厂模式
3.1什么是工厂模式
工厂模式是设计模式中的一种,它属于创建型模式。
工厂模式通过工厂类来创建对象,并将对象的创建过程封装在工厂类中,从而将对象的创建与使用分离,提高了系统的灵活性和可维护性。
工厂模式有三种常见的实现方式:
简单工厂模式:通过一个 Factory 类来创建对象,根据不同的参数返回不同的对象实例。
工厂方法模式:定义一个抽象的工厂类和多个具体的工厂类,每个具体的工厂类负责创建指定的产品对象。
抽象工厂模式:定义一个抽象的工厂类和多个具体的工厂类,每个具体工厂类负责创建一组相关的产品对象。
上面的代码使用的是:简单工厂模式
3.2工厂模式优缺点
工厂模式的优点:
工厂模式通过封装对象的创建过程,将对象的创建和使用解耦,提高了系统的灵活性和可维护性。
工厂模式可以通过配置或其他方式动态地改变对象的创建方式,使系统具有更高的可定制性和可扩展性。
工厂模式可以屏蔽具体产品类的实现细节,降低了客户端与具体产品类之间的耦合度,使系统更加可靠稳定。
工厂模式可以通过统一的接口来创建不同类别的产品对象,使客户端使用起来更加方便和简单。
工厂模式的缺点:
工厂模式增加了额外的开销,需要增加工厂类和产品类的数量和复杂度,不利于系统的维护和管理。
工厂模式增加了额外的抽象层,降低了系统的效率和性能,特别是在创建大量对象时。
工厂模式需要对不同的产品类进行分类和管理,增加了系统的复杂度和难度,尤其是在需要创建的产品类型较多的情况下。
总的来说,工厂模式的优点在于它能够提高系统的灵活性、可维护性和可扩展性,缺点在于它会增加系统的复杂度和开销,需要根据具体的情况进行选择和应用。