解释器模式的原理和实现
解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。
public interface Expression {long interpret();}public class NumberExpression implements Expression {private long number;public NumberExpression(long number) {this.number = number;}public NumberExpression(String number) {this.number = Long.parseLong(number);}@Overridepublic long interpret() {return this.number;}}public class AdditionExpression implements Expression {private Expression exp1;private Expression exp2;public AdditionExpression(Expression exp1, Expression exp2) {this.exp1 = exp1;this.exp2 = exp2;}@Overridepublic long interpret() {return exp1.interpret() + exp2.interpret();}}// SubstractionExpression/MultiplicationExpression/DivisionExpression与AdditionExpression代码结构类似,这里就省略了public class ExpressionInterpreter {private Deque<Expression> numbers = new LinkedList<>();public long interpret(String expression) {String[] elements = expression.split(" ");int length = elements.length;for (int i = 0; i < (length+1)/2; ++i) {numbers.addLast(new NumberExpression(elements[i]));}for (int i = (length+1)/2; i < length; ++i) {String operator = elements[i];boolean isValid = "+".equals(operator) || "-".equals(operator)|| "*".equals(operator) || "/".equals(operator);if (!isValid) {throw new RuntimeException("Expression is invalid: " + expression);}Expression exp1 = numbers.pollFirst();Expression exp2 = numbers.pollFirst();Expression combinedExp = null;if (operator.equals("+")) {combinedExp = new AdditionExpression(exp1, exp2);} else if (operator.equals("-")) {combinedExp = new AdditionExpression(exp1, exp2);} else if (operator.equals("*")) {combinedExp = new AdditionExpression(exp1, exp2);} else if (operator.equals("/")) {combinedExp = new AdditionExpression(exp1, exp2);}long result = combinedExp.interpret();numbers.addFirst(new NumberExpression(result));}if (numbers.size() != 1) {throw new RuntimeException("Expression is invalid: " + expression);}return numbers.pop().interpret();}}
