设计模式之解释器模式
来源:互联网 发布:ant java版本 编辑:程序博客网 时间:2024/05/01 18:07
解释器模式定义:给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
优点:
解释器是一个简单语法分析工具,它最显著的优点就是扩展性,修改语法规则只要修改相应的非终结符表达式就可以了,若扩展语法,则只要添加非终结符类就可以了。
缺点:
1、解释器模式会引起类膨胀。
2、解释器模式采用递归调用方法。
3、效率问题。
类图如下:
实现代码如下:
抽象的表达式类:
package com.designpatterns.interpreter;import java.util.HashMap;/** * @author WSYW126 * @version 创建时间:2016年5月8日 下午4:28:15 * 类说明:Alljava */public abstract class AbstractExpression {public abstract int interpreter(HashMap<String, Integer> var);}
变量解释器类:
package com.designpatterns.interpreter;import java.util.HashMap;/** * @author WSYW126 * @version 创建时间:2016年5月8日 下午4:31:09 类说明:Alljava */public class VarExpression extends AbstractExpression {private String key;public VarExpression(String key) {this.key = key;}@Overridepublic int interpreter(HashMap<String, Integer> var) {return var.get(this.key);}}
抽象运算符解释器类:
package com.designpatterns.interpreter;/** * @author WSYW126 * @version 创建时间:2016年5月8日 下午4:33:55 类说明:Alljava */public abstract class SymbolExpression extends AbstractExpression {protected AbstractExpression left;protected AbstractExpression right;public SymbolExpression(AbstractExpression left, AbstractExpression right) {this.left = left;this.right = right;}}
加法解释器:
package com.designpatterns.interpreter;import java.util.HashMap;/** * @author WSYW126 * @version 创建时间:2016年5月8日 下午5:05:49 * 类说明:Alljava */public class AddExpression extends SymbolExpression {public AddExpression(AbstractExpression left, AbstractExpression right) {super(left, right);}@Overridepublic int interpreter(HashMap<String, Integer> var) {return super.left.interpreter(var)+super.right.interpreter(var);}}
加法解释器:
package com.designpatterns.interpreter;import java.util.HashMap;/** * @author WSYW126 * @version 创建时间:2016年5月8日 下午5:04:45 * 类说明:Alljava */public class SubExpression extends SymbolExpression {public SubExpression(AbstractExpression left, AbstractExpression right) {super(left, right);}@Overridepublic int interpreter(HashMap<String, Integer> var) {return super.left.interpreter(var)-super.right.interpreter(var);}}
解析器封装类:
package com.designpatterns.interpreter;import java.util.HashMap;import java.util.Stack;/** * @author WSYW126 * @version 创建时间:2016年5月8日 下午5:06:26 类说明:Alljava */public class Calculator {private AbstractExpression AE;public Calculator(String expStr) {Stack<AbstractExpression> s = new Stack<AbstractExpression>();char[] chararray = expStr.toCharArray();AbstractExpression left = null;AbstractExpression right = null;for (int i = 0; i < chararray.length; i++) {switch (chararray[i]) {case '+':left = s.pop();right = new VarExpression(String.valueOf(chararray[++i]));s.push(new AddExpression(left, right));break;case '-':left = s.pop();right = new VarExpression(String.valueOf(chararray[++i]));s.push(new SubExpression(left, right));break;default:s.push(new VarExpression(String.valueOf(chararray[i])));break;}}this.AE = s.pop();}public int run(HashMap<String, Integer> var) {return this.AE.interpreter(var);}}
测试类:
package com.designpatterns.interpreter;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.HashMap;/** * @author WSYW126 * @version 创建时间:2016年5月8日 下午5:14:28 类说明:Alljava */public class Client {public static void main(String[] args) throws IOException {String expStr = getExpStr();HashMap<String, Integer> var = getValue(expStr);Calculator cal = new Calculator(expStr);System.out.println("运算结果为:" + expStr + "=" + cal.run(var));}private static HashMap<String, Integer> getValue(String expStr)throws IOException {HashMap<String, Integer> map = new HashMap<String, Integer>();for (char ch : expStr.toCharArray()) {if (ch != '+' && ch != '-') {if (!map.containsKey(String.valueOf(ch))) {String in = (new BufferedReader(new InputStreamReader(System.in))).readLine();map.put(String.valueOf(ch), Integer.valueOf(in));}}}return map;}private static String getExpStr() throws IOException {System.out.println("请输入计算的表达式:");return (new BufferedReader(new InputStreamReader(System.in))).readLine();}}
这就是解释器模式。
参考资料:
设计模式之禅
备注:
转载请注明出处:http://blog.csdn.net/wsyw126/article/details/51336078
作者:WSYW126
0 0
- 设计模式之解释器
- 设计模式之Interpreter解释器模式
- 设计模式之解释器模式
- 设计模式之解释器模式
- 设计模式之解释器模式
- 设计模式之解释器模式
- 设计模式之解释器模式
- 大话设计模式之解释器模式
- 设计模式之解释器模式
- 设计模式之解释器模式,interpreter
- 设计模式之解释器模式
- 设计模式之解释器模式
- 设计模式之解释器模式
- 设计模式之解释器模式(interpreter)
- 设计模式之解释器模式
- C++设计模式之解释器模式
- 设计模式之 - 解释器模式
- 设计模式之-----解释器模式
- 针对开发者的20款移动开发框架
- Android源代码结构分析
- 按各字符的ASCII码从小到大的顺序输出字符
- HDOJ 1013 Digital Roots
- json解析
- 设计模式之解释器模式
- JMS与ActiveMQ
- async不得不说的事:SynchronizationContext
- 研究生第四课 计算机网络
- C经典 宏与typedef的区别
- math.h简介
- 单元测试JUnit
- 对象序列化输出 Serializable
- MySQL 面试中的问题汇总