- 浏览: 778231 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
萨琳娜啊:
Java读源码之Netty深入剖析网盘地址:https://p ...
Netty源码学习-FileRegion -
飞天奔月:
写得有趣 ^_^
那一年你定义了一个接口 -
GoldRoger:
第二个方法很好
java-判断一个自然数是否是某个数的平方。当然不能使用开方运算 -
bylijinnan:
<script>alert("close ...
自己动手实现Java Validation -
paul920531:
39行有个bug:"int j=new Random ...
java-蓄水池抽样-要求从N个元素中随机的抽取k个元素,其中N无法确定
声明:
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
package design.pattern; /* * 解释器(Interpreter)模式的意图是可以按照自己定义的组合规则集合来组合可执行对象 * * 代码示例实现XML里面1.读取单个元素的值 2.读取单个属性的值 * 多个元素或者多个属性的示例书上也有,但稍显复杂,就不做这方面的笔记了 */ import java.util.ArrayList; import java.util.Collection; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; abstract class Expression { //可能返回一个String也可能返回多个。String书上说为了兼容,返回值定义为String数组 public abstract String[] interpret(Context context); } /** * Context持有两个Field: * 1.整个XML对象(Document document) * 2.上一个被处理的元素(Element preElement) * 当Expression执行interpret方法时,不断改变Context里的preElement,直到表达式终止为止 */ class Context { //上一个被处理的元素 private Element preElement; private Document document; public Context(String filePath) throws Exception { this.document = XMLUtil.getRoot(filePath); } public void redoInit() { this.preElement = null; } /** * 根据父元素和子元素的名字来获取子元素 * @param preElement 父元素 * @param elementName 要找的元素的名字 * @return 找到的元素 */ public Element getCurElement(Element preElement, String elementName) { Element result = null; NodeList nodeList = preElement.getChildNodes(); //遍历所有直接子元素(孙子元素不算) for (int i = 0, len = nodeList.getLength(); i < len ;i ++) { Node node = nodeList.item(i); if (node instanceof Element) { Element element = (Element)node; if (element.getNodeName().equals(elementName)) { result = element; break; } } } return result; } public Element getPreElement() { return preElement; } public void setPreElement(Element preElement) { this.preElement = preElement; } public Document getDocument() { return document; } } /** * 读取XML文件的帮助类。提供一个方法根据文件名返回XML Document对象 */ class XMLUtil { public static Document getRoot(String filePath) throws Exception { Document doc = null; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); doc = builder.parse(filePath); doc.normalize(); return doc; } } //非终结元素的解释器 class ElementExpression extends Expression { //在下面的测试,Expression的childExpressions只有一个。childExpressions.size() = 1 private Collection<Expression> childExpressions = new ArrayList<Expression>(); private String elementName; public ElementExpression(String elementName) { this.elementName = elementName; } public void add(Expression expression) { this.childExpressions.add(expression); } public void remove(Expression expression) { this.childExpressions.remove(expression); } public String[] interpret(Context context) { Element parent = context.getPreElement(); Element curElement = null; if (parent == null) { //说明是根元素 Document dom = context.getDocument(); curElement = dom.getDocumentElement(); //Document.getDocumentElement,取得根元素 } else { curElement = context.getCurElement(parent, elementName); } context.setPreElement(curElement); String[] ss = null; for (Expression expression : childExpressions) { //这里写得有歧义。如果childExpressions.size > 1,那ss只能获取到最后一个childExpression的返回值 //不过由于测试过程中,childExpressions.size = 1,也就问题不大 ss = expression.interpret(context); } return ss; } public String toString() { return "elementName = " + elementName + ", childExpressions = " + childExpressions; } } //元素作为终结符的解释器 class ElementTerminatorExpression extends Expression { private String elementName; public ElementTerminatorExpression(String elementName) { this.elementName = elementName; } public String[] interpret(Context context) { Element parent = context.getPreElement(); Element curElement = null; if (parent == null) { //说明是根元素 curElement = context.getDocument().getDocumentElement(); //返回根元素 } else { curElement = context.getCurElement(parent, elementName); } context.setPreElement(curElement); //获取元素的值 String finalValue = curElement.getFirstChild().getNodeValue(); return new String[]{finalValue}; } } //属性作为终结符的解释器 class PropertyTerminatorExpression extends Expression { private String propertyName; public PropertyTerminatorExpression(String propertyName) { this.propertyName = propertyName; } public String[] interpret(Context context) { //直接获取元素的属性的值 String finalValue = context.getPreElement().getAttribute(this.propertyName); return new String[]{finalValue}; } } //这个类是用来测试的 public class InterpreterPattern { public static void main(String[] args) throws Exception { /* <?xml version="1.0" encoding="UTF-8"?> <root id="rootId"> <a> <b> <c name="testC">12345</c> <d id="1">d1</d> <d id="2">d2</d> <d id="3">d3</d> <d id="4">d4</d> </b> </a> </root> */ Context context = new Context("d:/interpretPattern.xml"); //构建要查找的表达式的语法树,例如我们要查看元素c的值,表达式是root/a/b/c //元素作为终结符 ElementExpression root = new ElementExpression("root"); ElementExpression a = new ElementExpression("a"); ElementExpression b = new ElementExpression("b"); ElementTerminatorExpression c = new ElementTerminatorExpression("c"); root.add(a); a.add(b); b.add(c); String[] ss = root.interpret(context); System.out.println("c = " + ss[0]); //元素属性作为终结符,例如root/a/b/c.name context.redoInit(); ElementExpression roott = new ElementExpression("root"); ElementExpression aa = new ElementExpression("a"); ElementExpression bb = new ElementExpression("b"); ElementExpression cc= new ElementExpression("c"); PropertyTerminatorExpression prop = new PropertyTerminatorExpression("name"); roott.add(aa); aa.add(bb); bb.add(cc); cc.add(prop); ss = roott.interpret(context); System.out.println("c name = " + ss[0]); context.redoInit(); ss = roott.interpret(context); System.out.println("c name = " + ss[0]); } }
发表评论
-
J2EE设计模式-Intercepting Filter
2013-11-27 16:56 1498Intercepting Filter类似于职责链模式 有两种 ... -
《重构,改善现有代码的设计》第八章 Duplicate Observed Data
2012-12-04 20:34 1465import java.awt.Color; impor ... -
读《研磨设计模式》-代码笔记-状态模式-State
2012-10-07 16:56 1382声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-访问者模式-Visitor
2012-10-06 23:43 1042声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-命令模式-Command
2012-10-06 23:40 1163声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-适配器模式-Adapter
2012-09-26 00:23 1364声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-外观模式-Facade
2012-09-25 23:46 1003声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-备忘录模式-Memento
2012-09-23 00:05 1716声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-享元模式-Flyweight
2012-09-21 21:01 1174声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-抽象工厂模式-Abstract Factory
2012-09-21 20:59 953声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-职责链模式-Chain Of Responsibility
2012-09-15 17:57 1600声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-装饰模式-Decorator
2012-09-15 17:56 1156声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-桥接模式
2012-09-12 18:27 1339声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-策略模式-Strategy
2012-09-12 18:24 1060声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-工厂方法模式
2012-08-24 16:57 1138声明: 本文只为方便我 ... -
读《研磨设计模式》-代码笔记-简单工厂模式
2012-08-24 16:56 1086声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-组合模式
2012-08-23 18:13 873声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
读《研磨设计模式》-代码笔记-模板方法模式
2012-08-23 18:12 1254声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ... -
式工工工工
2012-08-23 00:09 0package pattern; //=========== ... -
读《研磨设计模式》-代码笔记-原型模式
2012-08-21 19:34 1080声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移 ...
相关推荐
在解释模式下加载艺术索引
Interpret-Community 是一个扩展的实验性存储库,具有额外的可解释性技术和实用功能来处理真实世界的数据集和工作流,以解释在表格数据上训练的模型。 此存储库包含 Interpret-Community SDK 和 Jupyter 笔记本,并...
资源分类:Python库 所属语言:Python 资源全名:interpret-0.1.17-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
python库,解压后可用。 资源全名:interpret-0.0.5-py3-none-any.whl
资源来自pypi官网。 资源全名:interpret-0.0.5-py3-none-any.whl
python库。 资源全名:azureml_interpret-1.19.0-py3-none-any.whl
资源来自pypi官网。 资源全名:azureml_interpret-1.35.0-py3-none-any.whl
资源来自pypi官网。 资源全名:azureml_contrib_interpret-1.17.0-py3-none-any.whl
ar模型matlab代码解释_FR 该存储库将提供用于可解释人脸识别的培训和评估代码。 有关详细信息,您可以检查相关的纸张。 先决条件: Tensorflow r1.0或更高版本 Python 2.7 / 3.6 下载CASIA-Webface培训数据库,并 ...
Laravel开发-interpret 一个基于驱动程序的内容呈现包,支持HTML、降价和纯文本。您可以为自定义内容类型注册自定义驱动程序。
资源分类:Python库 所属语言:Python 资源全名:interpret-community-0.6.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
资源分类:Python库 所属语言:Python 资源全名:azureml_contrib_interpret-1.0.69-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
JavaJavaScript 解释器布拉格 FIT CTU MI-RUN 课程的学期项目作者Ondrej Paska (paskaond)汇编使用 Apache Ant (build.xml) 编译ant - 将项目构建到 bin 文件夹ant Main - 运行解释器ant test - 运行所有测试ant ...
matlab精度检验代码解释神经成像中的机器学习模型 该存储库包含Matlab和Python代码以及我们的Nature Protocols论文中使用的样本fMRI数据。 依存关系 要运行Matlab脚本protocol_scripts_allsteps.m : -要获得全部...
资源分类:Python库 所属语言:Python 资源全名:interpret_community-0.18.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059