- 浏览: 592499 次
- 性别:
- 来自: 福建
文章分类
最新评论
-
18335864773:
用 pageoffice 吧. http://www.zhuo ...
使用Jacob输出word文档 -
dick1305:
很好,谢谢分享。
XFire创建WebService实例 -
wd530141534:
<c:if test="${ReleaseRe ...
Axis2创建WebService实例 -
wd530141534:
if(result != null && re ...
Axis2创建WebService实例 -
wd530141534:
String printerIp = req.getRemot ...
Axis2创建WebService实例
解释器模式:给定一个语言,定义它的文法的一种表示。并定义一个解释器,这个解释器使用该表示来解释
语言中的句子。
1.如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。
这样就可以构造一个解释器,该解释器通过解释这些句子来解决该问题。
2.当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。
3.使用解释器模式时,可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,
可使用继承来改变或扩展该文法。 也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,
这些类都易于直接编写。
4.抽象语法树的每一个节点都代表一个语句,而在每个节点上都可以执行解释方法。这个解释方法的
执行就代表这个语句被解释。
5.一般系统中很多类使用相似的语法,可以使用一个解释器来代替为每一个规则实现一个解释器。
6.不足:解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。
建议当文法非常复杂时,使用其它的技术如语法分析程序或编译器生成器来处理。
/** * 抽象表达式,声明一个抽象的解释操作,这个接口为抽象语法树中的所有节点所共享。 */ public abstract class AbstractExpression { public abstract void interpret(Context context); }
/** * 终结符表达式,实现与文法中的终结符相关联的解释操作。 * 文法中每一个终结符都有一个具体的终结表达式与之相对应。 */ public class TerminalExpression extends AbstractExpression{ @Override public void interpret(Context context) { System.out.println("终端解释器"); } }
/** * 非终结符表达式,为文法中的非终结符实现解释操作。 * 对文法中的每一条规则R1,R2...Rn都需要一个具体的非终结符表达式类。 * 解释操作以递归方式调用上面所提到的代表R1,R2....Rn中的各个符号的实例变量。 */ public class NonTerminalExpression extends AbstractExpression{ @Override public void interpret(Context context) { System.out.println("非终端解释器"); } }
/** * 包含解释器之外的一些全局信息。 */ public class Context { private String intput; private String output; public String getIntput() { return intput; } public void setIntput(String intput) { this.intput = intput; } public String getOutput() { return output; } public void setOutput(String output) { this.output = output; } }
public class Main { public static void main(String[] args) { // 构建表示该文法定义的语言中一个特定的句子的抽象语法树,调用解释操作。 Context context = new Context(); List<AbstractExpression> list = new ArrayList<AbstractExpression>(); list.add(new TerminalExpression()); list.add(new NonTerminalExpression()); list.add(new TerminalExpression()); list.add(new TerminalExpression()); for(AbstractExpression expression:list){ expression.interpret(context); } } }
解释器模式示例:音乐解释器事例(音符,音阶,音速等)
/** * 演奏内容类 */ public class PlayContext { // 演奏文本 private String text; public String getText() { return text; } public void setText(String text) { this.text = text; } }
/** * 表达式类 */ public abstract class Expression { //解释器 public void interpret(PlayContext context){ if(context.getText().length()==0){ return; }else{ // 获取playKey和playValue //(例:"O 3 E 0.5 G 0.5 A 3 "playKey为O,playValue为3) char playKey = context.getText().substring(0,1).charAt(0); context.setText(context.getText().substring(2)); Double playValue = Double.parseDouble(context.getText() .substring(0,context.getText().indexOf(" "))); // 获得playKey和playValue后,将其从演奏文本中移除 // (例:"O 3 E 0.5 G 0.5 A 3 "变成"E 0.5 G 0.5 A 3 ") context.setText(context.getText().substring(context.getText().indexOf(" ")+1)); execute(playKey, playValue); } } // 执行,抽象方法执行不同的文法子类,有不同的执行处理。 public abstract void execute(char key,Double value); }
/** * 音符类,终结符表达式 */ public class Note extends Expression{ @Override public void execute(char key, Double value) { String note = ""; // 如果获得的key是C则演奏1(do),D则演奏2(Re) switch(key){ case 'C': note = "1"; break; case 'D': note = "2"; break; case 'E': note = "3"; break; case 'F': note = "4"; break; case 'G': note = "5"; break; case 'A': note = "6"; break; case 'B': note = "7"; break; } System.out.print(note+" "); } }
/** * 音阶类,终结符表达式 */ public class Scale extends Expression{ @Override public void execute(char key, Double value) { String scale = ""; // 如果获得的key是O并且value是1则演奏低音,2则是中音,3则是高音 switch(value.intValue()){ case 1: scale = "低音"; break; case 2: scale = "中音"; break; case 3: scale = "高音"; break; } System.out.print(scale+" "); } }
/** * 音速类,终结符表达式 */ public class Speed extends Expression{ @Override public void execute(char key, Double value) { // T 1000 表示每节拍一秒,T 500 表示每节拍半秒 String speed = ""; if(value<500){ speed = "快速"; }else if(value>=1000){ speed = "慢速"; }else{ speed = "中速"; } System.out.print(speed+" "); } }
public class Main { public static void main(String[] args) { PlayContext context = new PlayContext(); System.out.println("上海滩:"); context.setText("T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3"); Expression expression = null; try{ while (context.getText().length()>0){ char str = context.getText().substring(0,1).charAt(0); switch (str){ case 'O': // 当首字母是O时,表达式实例化为音阶 expression = new Scale(); break; case 'T': // 当首字母是T时,表达式实例化为音速 expression = new Speed(); break; case 'C': case 'D': case 'E': case 'F': case 'G': case 'A': case 'B': case 'P': // 当首字母是CDEFGAB以及休止符P时,表达式实例化为音符 expression = new Note(); break; } expression.interpret(context); } }catch(Exception e){ e.printStackTrace(); } } }
输出结果如下:
上海滩: 中速 中音 3 5 6 3 5 5 2 3 5 6 高音 1 中音 6 5 1 3
发表评论
-
设计模式的一些相关原则
2011-06-23 17:01 1376面向对象的三大特性 ... -
访问者模式
2011-06-23 16:31 1772访问者模式:表示一个作用于某对象结构中的各元素的操作。它使 ... -
模板方法模式
2011-06-23 11:16 1169模板方法模式:定义一个操作中的算法的骨架,而将一些步骤迟到 ... -
策略模式
2011-06-23 10:29 1108策略模式: 定义了算 ... -
状态模式
2011-06-22 16:34 1270状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象 ... -
单例模式
2011-06-22 15:30 1259单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点 ... -
代理模式
2011-06-22 15:14 1006代理模式:为其它对象提供一种代理,以控制对这个对象的访问。 ... -
原型模式
2011-06-22 14:36 1074原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型 ... -
观察者模式
2011-06-17 10:46 1242观察者模式(发布-订 ... -
备忘录模式
2011-06-16 10:58 1034备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态 ... -
中介者模式
2011-06-16 10:10 1859中介者模式:用一个中介对象来封装一系列的对象交互,从而降低 ... -
迭代器模式
2011-06-15 11:17 2879迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不 ... -
享元模式
2011-06-14 11:22 1085享元模式:运用共享技术有效地支持大量细粒度的对象。 ... -
抽象工厂模式
2011-06-14 10:42 1228抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口, ... -
简单工厂与工厂方法模式
2011-06-13 16:38 1136简单工厂模式:由一个工厂对象决定创建出哪一种产品类的实例。 ... -
外观模式
2011-06-13 15:08 1078外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了 ... -
命令模式
2011-04-21 17:40 1211命令模式:将一个请求 ... -
桥接模式
2011-04-20 21:24 1375桥接模式:将抽象部分与他的实现部分分离,使它们都可以独立地变化 ... -
职责链模式
2011-04-20 21:23 1278职责链模式:使多个对 ... -
装饰模式
2010-09-01 21:35 1213装饰模式: 1. 动态地给一个对象添加一些额外的职责,就 ...
相关推荐
解释器模式是一种行为设计模式,它允许我们定义一个语言的语法,并提供一个解释器来解析该语言中的句子。在Java中实现解释器模式,我们可以创建一个抽象表达式接口,然后为每种特定的语法结构创建一个具体表达式类。...
解释器模式是一种设计模式,它允许我们为特定的语言或表达式定义一个解析规则,并通过这个规则来解释执行这些语言或表达式。在本例子中,我们将深入探讨如何使用解释器模式来实现一个能够理解并执行机器人指令的系统...
**设计模式之解释器模式(Interpreter Pattern)** 解释器模式是一种行为设计模式,它提供了一种方式来表示语言的语法,并实现一个解释器用于解析这种语法的语句。这种模式通常用于小型、特定领域的语言(DSL)实现,...
**解释器模式(Interpreter)**是一种行为设计模式,它允许我们定义一种语言并为其创建一个解释器。在软件工程中,这种模式常用于处理简单的语言或表达式,例如配置文件、计算公式或者简单的脚本语言。通过使用解释...
解释器模式是一种设计模式,它允许我们为特定的语言或表达式定义一个解析规则,并提供一个解释器来执行这些规则。这种模式在处理简单的语言或结构化表达式时特别有用,例如配置文件、简单的数学表达式或者编程语言的...
解释器模式(Interpreter Pattern)是25种经典设计模式之一,主要应用于创建一个解析语言或者表达式的方式。在本篇文章中,我们将深入探讨解释器模式的概念、结构以及其在实际开发中的应用。 解释器模式是一种行为...
**行为型模式——解释器模式** 解释器模式是一种设计模式,它允许我们为特定语言创建一个解析器。这种模式在处理简单的语言或表达式时特别有用,例如配置文件、简单的编程语言或者数学表达式。解释器模式的核心在于...
解释器模式是一种设计模式,它允许我们为特定的语言或表达式定义一个解析规则。在软件工程中,这种模式常用于构建简单的语言解释器或者执行基于某种规则的逻辑。本讲将深入探讨解释器模式的原理、结构以及在实际开发...
**解释器模式**是一种行为设计模式,它提供了一种方式来表示语言的语法,并通过类和对象解析这种语法。在编程领域,解释器模式常用于创建简单的语言或表达式解析器,例如配置文件、计算器应用或者SQL查询的简化版本...
解释器模式是一种设计模式,用于创建能解析特定语言或规则集的解释器。这种模式的核心在于定义一个表达式的抽象语法树(AST),并提供一个解释器来遍历这棵树,执行与之相关的操作。在 GoF 的《设计模式》书中,解释...
《C语言解释器的实现与解释器模式解析》 在编程世界中,编译器和解释器是两种关键的工具,它们将高级编程语言转换为机器可以理解的指令。本篇我们将聚焦于“C语言解释器”的实现,以及在设计过程中所采用的“解释器...
如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一...解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中。
Android解释器模式简单Demo,通过实现计算器四则运算,加减的逻辑,来领悟解释器这种模式的设计,同步博文:http://blog.csdn.net/qq_28690547/article/details/50707916
c++设计模式-行为型模式-解释器模式;qt工程;c++简单源码; 解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式...
解释器模式,也被称为解析器模式,是一种设计模式,它允许我们定义一套语言的文法,并为这个语言提供解释器。这种模式常用于构建小型、特定领域的语言,比如配置文件、简单的脚本或计算器等。在Java、Python等面向...
解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义一个语言的文法,并解析语言中的表达式。具体来说,解释器模式通过定义一个解释器来解释语言中的表达式,从而实现对语言的解析和执行。 在解释...
该应用程序使用Java中的解释器模式来解析和评估算术表达式,如“5 + 3 * 2”。在这里,解释器将表达式的每个部分转换为表示数字和操作的对象。这些对象遵循定义的语法,使应用程序能够根据算术规则正确理解和计算...