实际用途:简单的计算器
假设我们要实现一个简单的计算器,可以解析并计算基本的数学表达式,包括加法、减法、乘法和除法。这个计算器将能够处理表达式如 "3 + 5 * (2 - 8)"
。
使用解释器模式的代码示例
1. 表达式接口
javainterface Expression { int interpret(); }
2. 终结符表达式(数字)
javaclass NumberExpression implements Expression { private int number; public NumberExpression(int number) { this.number = number; } @Override public int interpret() { return number; } }
3. 非终结符表达式(操作符)
javaclass AddExpression implements Expression { private Expression left; private Expression right; public AddExpression(Expression left, Expression right) { this.left = left; this.right = right; } @Override public int interpret() { return left.interpret() + right.interpret(); } } class SubtractExpression implements Expression { private Expression left; private Expression right; public SubtractExpression(Expression left, Expression right) { this.left = left; this.right = right; } @Override public int interpret() { return left.interpret() - right.interpret(); } } class MultiplyExpression implements Expression { private Expression left; private Expression right; public MultiplyExpression(Expression left, Expression right) { this.left = left; this.right = right; } @Override public int interpret() { return left.interpret() * right.interpret(); } } class DivideExpression implements Expression { private Expression left; private Expression right; public DivideExpression(Expression left, Expression right) { this.left = left; this.right = right; } @Override public int interpret() { return left.interpret() / right.interpret(); } }
4. 构建表达式并计算
javapublic class InterpreterCalculatorExample { public static void main(String[] args) { // 表达式: 3 + 5 * (2 - 8) Expression expr = new AddExpression( new NumberExpression(3), new MultiplyExpression( new NumberExpression(5), new SubtractExpression( new NumberExpression(2), new NumberExpression(8) ) ) ); System.out.println("Result: " + expr.interpret()); // 输出: Result: -13 } }
对比:未使用解释器模式的代码示例
假设我们不使用解释器模式,而是直接用常规的代码实现相同的功能,这里是一个不使用解释器模式的“差”代码示例。这个示例展示了代码如何随着需求的增加变得复杂和难以维护。
未使用解释器模式的代码
javapublic class Calculator { public static int evaluate(String expression) { // 简化版本:仅支持单一操作符的表达式 // 实际代码可能需要解析和计算整个表达式 String[] tokens = expression.split(" "); int result = Integer.parseInt(tokens[0]); for (int i = 1; i < tokens.length; i += 2) { String operator = tokens[i]; int number = Integer.parseInt(tokens[i + 1]); switch (operator) { case "+": result += number; break; case "-": result -= number; break; case "*": result *= number; break; case "/": result /= number; break; default: throw new IllegalArgumentException("Invalid operator"); } } return result; } public static void main(String[] args) { // 示例表达式: 3 + 5 * 2 - 8 // 注意:这种方法仅能处理简单的表达式 System.out.println("Result: " + evaluate("3 + 5 * 2 - 8")); // 输出: Result: 10 } }
对比分析
- 灵活性:使用解释器模式可以轻松扩展支持更多的操作符和复杂的表达式,而不需要改变现有的代码。未使用解释器模式的代码在处理更复杂的表达式时会变得非常困难,且难以维护。
- 可读性和维护性:解释器模式通过将语法规则和执行逻辑分离,使代码更加清晰和易于维护。未使用解释器模式的代码会随着功能增加而变得更加复杂和难以理解。
- 扩展性:使用解释器模式可以轻松地添加新的表达式和操作符,而不需要大幅修改现有代码。未使用解释器模式的代码在扩展功能时需要处理更多的条件和逻辑,增加了错误的风险。
通过这个对比,解释器模式展示了如何有效地管理和解析复杂的表达式,同时保持代码的灵活性和可维护性。
标签:right,int,Interpreter,设计模式,Expression,public,interpret,left From: https://www.cnblogs.com/spicy-food/p/18411333