一个解释器模式中包含的四种角色html
使用解释器模式实现一个简单的语法 计算 6 100 11 + * 表达式,首先记录数值,而后按照顺序添加符号计算。
100 + 11
111 * 6
666
/** * 表达式定义接口 */ public interface Interpreter { int interpret(); } /** * 相加表达式 */ public class AddInterpreter implements Interpreter { private Interpreter firstExpression, secondExpression; public AddInterpreter (Interpreter firstExpression, Interpreter secondExpression) { this.firstExpression = firstExpression; this.secondExpression = secondExpression; } @Override public int interpret() { return this.firstExpression.interpret() + this.secondExpression.interpret(); } @Override public String toString() { return "+"; } } /** * 相乘规则表达式 */ public class MultiInterpreter implements Interpreter { private Interpreter firstExpression, secondExpression; public MultiInterpreter(Interpreter firstExpression, Interpreter secondExpression) { this.firstExpression = firstExpression; this.secondExpression = secondExpression; } @Override public int interpret() { return this.firstExpression.interpret() * this.secondExpression.interpret(); } @Override public String toString() { return "*"; } } /** * 数值型表达式 */ public class NumberInterpreter implements Interpreter { private int number; public NumberInterpreter(int number) { this.number = number; } public NumberInterpreter(String number){ this.number = Integer.parseInt(number); } @Override public int interpret() { return this.number; } } /** * 格式化表达式 */ public class ExpressionParser { private Stack<Interpreter> stack = new Stack<>(); public int parse (String expression) { String[] itemArray = expression.split(" "); for (String symbol : itemArray) { if (!OperatorUtil.isOperator(symbol)) { Interpreter numberExpression = new NumberInterpreter(symbol); stack.push(numberExpression); System.out.println(String.format("入栈: %d", numberExpression.interpret())); } else { //是运算符能够计算 Interpreter firstExpression = stack.pop(); Interpreter secondExpression = stack.pop(); System.out.println(String.format("出栈:%d 和 %d", firstExpression.interpret(), secondExpression.interpret())); Interpreter operator = OperatorUtil.getExpression(firstExpression, secondExpression, symbol); System.out.println(String.format("应用运算符: %s", operator)); int result = operator.interpret(); NumberInterpreter numberInterpreter = new NumberInterpreter(result); stack.push(numberInterpreter); System.out.println(String.format("阶段结果入栈: %d", result)); } } return stack.pop().interpret(); } } /** * 工具类 */ public class OperatorUtil { public static boolean isOperator(String symbol) { return (symbol.equals("+") || symbol.equals("*")); } public static Interpreter getExpression(Interpreter first, Interpreter second, String symbol) { switch (symbol) { case "+": return new AddInterpreter(first, second); case "*": return new MultiInterpreter(first, second); default: return null; } } }
/** * 测试类 */ public class Test { public static void main(String[] args) { String input = "6 100 11 + *"; ExpressionParser parser = new ExpressionParser(); int result = parser.parse(input); System.out.println("解释器运算结果:" + result); } }
入栈: 6 入栈: 100 入栈: 11 出栈:11 和 100 应用运算符: + 阶段结果入栈: 111 出栈:111 和 6 应用运算符: * 阶段结果入栈: 666 解释器运算结果:666
在样例中:AddInterpreter和MultiInterpreter为终结表达式,NumberInterpreter为非终结表达式,ExpressionParser为环境角色。java
解释器模式和适配器模式git
慕课网设计模式精讲
: https://coding.imooc.com/class/270.html 23种设计模式(14):解释器模式
: https://blog.csdn.net/zhengzhb/article/details/7666020