设计模式之解释器模式
2016-05-08 17:35
323 查看
解释器模式定义:给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
优点:
解释器是一个简单语法分析工具,它最显著的优点就是扩展性,修改语法规则只要修改相应的非终结符表达式就可以了,若扩展语法,则只要添加非终结符类就可以了。
缺点:
1、解释器模式会引起类膨胀。
2、解释器模式采用递归调用方法。
3、效率问题。
类图如下:
实现代码如下:
抽象的表达式类:
变量解释器类:
抽象运算符解释器类:
加法解释器:
加法解释器:
解析器封装类:
测试类:
这就是解释器模式。
参考资料:
设计模式之禅
备注:
转载请注明出处:http://blog.csdn.net/wsyw126/article/details/51336078
作者:WSYW126
优点:
解释器是一个简单语法分析工具,它最显著的优点就是扩展性,修改语法规则只要修改相应的非终结符表达式就可以了,若扩展语法,则只要添加非终结符类就可以了。
缺点:
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; } @Override public 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); } @Override public 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); } @Override public 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
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用