设计模式之解释器模式22
2016-10-16 23:53
309 查看
设计模式之解释器模式22
背景
当我们需要计算a+b-c时,我们需要第一步,定义这个表达式,赋予其逻辑。然后将变量填充,得出结果。我们现在用程序来理解它。类图
代码实现
表达式的抽象类public abstract class Expression { //解析公式与数值,其中var中的key值是公式中的参数,value值是具体的数字 public abstract int interpreter(HashMap<String,Integer> var); }
变量的类
public class VarExpression extends Expression{ private String key; public VarExpression(String _key) { this.key = _key; } @Override public int interpreter(HashMap<String, Integer> var) { return var.get(this.key); } }
符号抽象类
public abstract class SymbolExpression extends Expression{ protected Expression left; protected Expression right; public SymbolExpression(Expression _left, Expression _right) { this.left = _left; this.right = _right; } }
加号
public class AddExpression extends SymbolExpression{ public AddExpression(Expression _left, Expression _right) { super(_left, _right); } @Override public int interpreter(HashMap<String, Integer> var) { return super.left.interpreter(var) + super.right.interpreter(var); } }
减号
public class SubExpression extends SymbolExpression{ public SubExpression(Expression _left, Expression _right) { super(_left, _right); } @Override public int interpreter(HashMap<String, Integer> var) { return super.left.interpreter(var) - super.right.interpreter(var); } }
暴露的API处理类
public class Calculator { private Expression expression; public Calculator(String expStr) { Stack<Expression> stacks = new Stack<Expression>(); char[] charArray = expStr.toCharArray(); Expression left = null; Expression right = null; for(int i=0; i<charArray.length; i++) { switch (charArray[i]) { case '+': left = stacks.pop(); right = new VarExpression(String.valueOf(charArray[++i])); stacks.push(new AddExpression(left, right)); break; case '-': left = stacks.pop(); right = new VarExpression(String.valueOf(charArray[++i])); stacks.push(new SubExpression(left, right)); break; default: stacks.push(new VarExpression(String.valueOf(charArray[i]))); } } this.expression = stacks.pop(); } public int run(HashMap<String,Integer> var) { return this.expression.interpreter(var); } }
客户端调用
public class Client { public static void main(String[] args) { String expStr = "a+b-c"; HashMap<String,Integer> var = new HashMap<String, Integer>(); var.put("a", 100); var.put("b", 5); var.put("c", 10); Calculator cal = new Calculator(expStr); System.out.println(cal.run(var)); } }
运行结果
95
相关文章推荐
- JAVA设计模式(22):行为型-解释器模式(Interpreter)
- 设计模式22---设计模式之解释器模式(Interpreter)(行为型)
- 设计模式-22-解释器模式
- JAVA设计模式(22):行为型-解释器模式(Interpreter)
- 设计模式学习总结(22) 解释器模式
- 设计模式(22)-解释器模式(Interpreter)
- 设计模式学习总结(22) 解释器模式
- 设计模式(22)-Strategy Pattern
- 设计模式循序渐进(9)解释器模式 Interpreter
- .NET设计模式(20):解释器模式(Interpreter Pattern)
- C#面向对象设计模式纵横谈 学习笔记22 State模式(行为型模式)
- 设计模式笔记 15. Interpreter 解释器模式(行为型模式)
- 设计模式——解释器模式
- 设计模式(22)-Strategy Pattern
- 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)
- 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)
- 设计模式之Interpreter(解释器)
- 设计模式笔记(二十三) —— 解释器模式
- 设计模式----Interpreter(解释器)模式
- 设计模式(22)-迭代器模式(Iterator)