XML建模
一、概念
XML建模是指使用XML来描述和定义数据模型。
在XML建模中,可以使用标签,属性和元素来定义和描述数据模型。标签用于定义元素的名称和结构,属性用于描述元素的特征和属性,而元素则是XML中最基本的数据单元,它可以包含文本,其他元素或属性。
二、优点
XML建模的主要好处之一是它的可扩展性和灵活性。XML允许使用者根据应用程序的需求定义自定义标记和元素,以及可以通过使用现成的标准标记来定义模型。
一旦XML模型被定义并创建,它就可以用于许多不同类型的应用程序,例如Web服务,数据传输等
三、考虑因素
- 定义模型的目的和规范
- 确定要表示和描述的数据
- 设计模型结构和元素
- 描述元素和属性的语义
- 确定可重复元素和引用模型中的其他元素的方法
四、核心思想
XML建模的核心思想其实就是Java面向对象思想
,将xml里的内容视作对象来操作
面向对象:它将现实世界中的事物看作一个个对象,每个对象都有自己的属性和行为,并且能够通过与其他对象互动来完成一些任务
五、代码举例
这里有一个xml文件,需求是拿到第二个action里的第二个forward的path值,即welcome.jsp
<?xml version="1.0" encoding="UTF-8"?> <config> <action path="registerAction" type="test.action.RegisterAction"> <forward name="success" path="index1.jsp" redirect="true" /> <forward name="failed" path="register.jsp" redirect="false" /> </action> <action path="loginAction" type="test.action.LoginAction"> <forward name="success" path="index.jsp" redirect="false" /> <forward name="success" path="welcome.jsp" redirect="true" /> </action> </config>
以面向对象思想来思考以上文件:
1.configModel对象中有一个属性(容器Map),能够以一对一的方式存储actionModel,增加和查询
2.actionModel 也有一个属性(容器Map) ,能够添加和查询forwardModel,还有属性path、type
3.forwardModel 有属性name、path、redirect
我们进行代码操作:
5.1初步代码
package com.xqx.modeldemo; public class ForwardModel { private String name; private String path; private boolean redirect; public ForwardModel() { // TODO Auto-generated constructor stub } @Override public String toString() { return "Forward [name=" + name + ", path=" + path + ", redirect=" + 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; } public ForwardModel(String name, String path, boolean redirect) { super(); this.name = name; this.path = path; this.redirect = redirect; } }
package com.xqx.modeldemo; import java.util.HashMap; import java.util.Map; public class ActionModel { private String path; private String type; private Map<String, ForwardModel> fMap = new HashMap<>(); 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 Map<String, ForwardModel> getfMap() { return fMap; } public void setfMap(Map<String, ForwardModel> fMap) { this.fMap = fMap; } // 压栈,将ForwardModal放入ActionModal public void push(ForwardModel fd) { fMap.put(fd.getName(), fd); } // 弹栈,从action中取出forward(查询forward) public ForwardModel pop(String name) { return fMap.get(name); } }
package com.xqx.modeldemo; import java.util.HashMap; import java.util.Map; public class ConfigModel { private Map<String, ActionModel> aMap = new HashMap<String, ActionModel>(); // 压栈,将ActionModal放入ConfigModal public void push(ActionModel ac) { aMap.put(ac.getPath(), ac); } // 弹栈,从ConfigModal中取出ActionModal(查询ActionModal) public ActionModel pop(String path) { return aMap.get(path); } }
5.2工厂模式
5.2.1简介
工厂模式是一种创建型设计模式,其目的是封装对象的实例化过程。在工厂模式中,我们将对象的创建任务交给一个工厂对象来完成,而不是由应用程序直接实例化一个对象。这能够有效地减少应用程序中的耦合度。
5.2.2优点
- 避免了直接依赖,降低了应用程序的耦合度,提高了代码的可维护性和可扩展性。
- 使用工厂方法来创建对象,可以根据需要在运行时动态地生成具体的实例。
- 封装了对象的创建细节,使得对象的创建过程能够更加灵活。
- 通过多态来实现对象的创建,增加了代码的可读性和可维护性。
package com.xqx.modeldemo; import java.io.InputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 工厂:生产数据 * * @author W许潜行 * */ public class ConfigModelFactory { public static ConfigModel build() throws Exception { String xPath = "/config.xml"; return build(xPath); } public static ConfigModel build(String xPath) throws Exception { ConfigModel cm = new ConfigModel(); //获取xPath InputStream is = ConfigModelFactory.class.getResourceAsStream(xPath); SAXReader sr = new SAXReader(); //读取 Document doc = sr.read(is); //拿到所有action List<Element> action = doc.selectNodes("//action"); for (Element actionEle : action) { ActionModel am = new ActionModel(); //为path、type赋值 am.setPath(actionEle.attributeValue("path")); am.setType(actionEle.attributeValue("type")); //拿到所有forword List<Element> forward = actionEle.selectNodes("forward"); for (Element forwardEle : forward) { ForwardModel fm = new ForwardModel(); //为path、name、redirect赋值 fm.setName(forwardEle.attributeValue("name")); fm.setPath(forwardEle.attributeValue("path")); fm.setRedirect(!"false".equals(forwardEle.attributeValue("redirect"))); //将forwardEle添加到action am.push(fm); } //将action添加到ConfigModel cm.push(am); } //至此config的数据全部读取完毕 return cm; } public static void main(String[] args) throws Exception { ConfigModel build = ConfigModelFactory.build(); ActionModel actionModal = build.pop("loginAction"); ForwardModel forwardModal = actionModal.pop("failed"); System.out.println(forwardModal.getPath());//welcome.jsp } }
上述xml代码解析代码看不懂的,可以看我上一篇博客XML解析
我们这个ConfigModelFactory类的生产任务就是读取到xml文件的信息,以后不管是张三要拿到第二个action里的第二个forward的path值,还是李四想拿到拿到第一个action里的第一个forward的type值,直接来调用工厂的数据进行操作即可,而不必每次自己去解析读取数据,减少了代码的重复性
好啦,今天的分享就到此为止!希望你看完本篇文章有所收获,祝你变得更强!!!