本文最后更新于 2025年7月28日 晚上
解释器模式提供了评估语言的语法或表达式的方式
角色
- 抽象表达式(Expression) :定义解释操作的接口,是终结符与非终结符表达式的父类。
- 终结符表达式(TerminalExpression) :实现表达式接口,用于表示语法中的基本元素,如数字、变量等。
- 非终结符表达式(NonTerminalExpression) :组合多个表达式,对应文法中的组合规则,如加减法、布尔表达式等。
- (可选)上下文类(Context) :用于存储变量、函数等符号与值的映射关系。本例中简化未使用。
- 客户端(Client) :构建表达式并触发解释操作。
优点
扩展性强
缺点
- 引起类的膨胀,需要创建大量的类
- 效率问题,主要采用递归的调用方法
实现解释器模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| public abstract class Expression{ public abstract int interpret(); }
public class ValueExpression extends Expression{ private int value ; public ValueExpression(){}
public ValueExpression(int value){ this.value = value ; } public int getValue(){ return value ; } public void setValue(int value){ this.value = value ; } @Override public int interpret(){ return this.value ; }
}
public class SymbolExpression extends Expression{ protected Expression left ; protected Expression right ;
public SymbolExpression(Expression left , Expression right){ this.left = left ; this.right = right ; } @Override public int interpret(){ return 0 ; } }
public class AddExpression extends SymbolExpression{ public AddExpression(Expression left , Expression right){ super(left , right); }
@Override public int interpret(){ return left.interpret() + right.interpret(); } }
public class SubExpression extends SymbolExpression{ public SubExpression(Expression left , Expression right){ super(left,right); }
@Override public int interpret(){ return left.interpret()-right.interpret(); } }
public class Calculator{ public int calculate(String statement){ String[] strs = statement.split(" "); Expression left = new ValueExpression(Integer.valueOf(strs[0])); Expression right = new ValueExpression(Integer.valueOf(strs[2])); String symbol = strs[1]; Expression symbolExpression = null ; if("+".equals(symbol)){ symbolExpression = new AddExpression(left , right); } else if ("-".equals(symbol)){ symbolExpression = new SubExpression(left , right); } return symbolExpression.interpret(); } }
public class Client { public static void main(String[] args){ String statement = "1+2"; Calculator calculator = new Calculator(); int rs = calculator.calculate(statement); System.out.println(statement+"=" + rs ); statement = "5-3"; rs = calculator.calculate(statement); System.out.println(statement+"=" + rs ); } }
|
总结
解释器模式(Interpreter Pattern)用于构建一个解释器,对给定语言中的语句或表达式进行求值。它定义了一个语言的文法规则,并用类来表示文法中的各个规则,最终通过组合这些规则来解析表达式。解释器模式适用于语言规则较简单、语法稳定的场景,比如计算器、脚本语言、正则表达式等。