[设计模式] 浅谈解释器模式
解释器模式
模式功能说明:为语言创建解释器,通常由语言的语法和语法分析来定义。
模式思路与原理
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树的时候,可以使用解释器模式。而当存在以下情况时该模式效果最好:文法简单对效率要求不高、环境类中包含解释之外的操作。
案例
public interface Expression {
int interpret(Context context);
}
public class AddExpression implements Expression {
@Override
public int interpret(Context context) {
return context.getNum1() + context.getNum2();
}
}
public class SubtractExpression implements Expression {
@Override
public int interpret(Context context) {
return context.getNum1() - context.getNum2();
}
}
public class Context {
private int num1;
private int num2;
public Context(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
}
public int getNum1() {
return num1;
}
public int getNum2() {
return num2;
}
}
public class InterpreterPatternDemo {
public static void main(String[] args) {
Context context = new Context(3, 7);
Expression addExpression = new AddExpression();
System.out.println("Add: " + addExpression.interpret(context));
Expression subtractExpression = new SubtractExpression();
System.out.println("Subtract: " + subtractExpression.interpret(context));
}
}
我们定义一个表达式接口,实现加法和减法表达式。定义一个上下文类,它包含了解释器需要的数据,我们可以使用解释器模式解释表达式
使用场景:
- 通常用于解释SQL
- 符号处理引擎
优缺点
优点:
- 易于改变和扩展文法。因为使用类来表示文法规则,你可以使用继承来改变或扩展文法。
- 实现文法规则的类可以复用在其他的相似的文法中。
缺点:
- 对于复杂的文法,类的层次会变得庞大,而且难以管理。此外,解释器模式会引起大量的小对象,增加了垃圾回收的压力。
- 解释器模式是解决对客户输入表达式的解析工作,因为它创建于问题抽象,所以解释器模式在实际的开发中使用的非常少。
总结
解释器模式开闭原则,因为我们可以轻松地添加新的解释器,而不需要修改现有的代码 解释器模式提供了一种解释语言的方法,可以用于构建解释语言的解释器,但是对于复杂的文法,其实现可能会变得复杂且难以管理。因此,解释器模式主要用于简单的文法解释