解释器模式(interpreter) ,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
解释器模式中的角色:
- Context:包含解释器之外的一些全局信息
- AbstractExpression:抽象表达式,声明一个抽象的解释操作,这个接口为抽象语法树中所有的结点所共享。
- TerminalExpression:终结符表达式,实现与文法中的终结符相关联的解释操作。
- NonterminalExpression:非终结符表达式,为文法中的非终结符号,为文法中的非终结符实现解释操作。对文法中每一条规则 R1、R2...Rm 都需要一个具体的非终结符表达式类。
解释器模式的简单实现
(1)Context 类
public class Client {
public static void main(String[] args) {
Context context = new Context();
List<AbstractExpression> abstractExpressionList = new ArrayList<>();
abstractExpressionList.add(new TerminalExpression());
abstractExpressionList.add(new NonterminalExpression());
abstractExpressionList.add(new TerminalExpression());
abstractExpressionList.add(new TerminalExpression());
for (AbstractExpression abstractExpression : abstractExpressionList) {
abstractExpression.interpret(context);
}
}
}
(2)抽象表达式
public abstract class AbstractExpression {
public abstract void interpret(Context context);
}
(3)终结符表达式
public class TerminalExpression extends AbstractExpression {
@Override
public void interpret(Context context) {
System.out.println("终端解释器");
}
}
(4)非终结符表达式
public class NonterminalExpression extends AbstractExpression {
@Override
public void interpret(Context context) {
System.out.println("非终端解释器");
}
}
解释器模式的应用场景
应用场景:
当语言的文法较为简单,且执行效率不是关键问题时。
当问题重复出现,且可以用一种简单的语言来进行表达时。
当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象语法树的时候,如 XML 文档解释。
解释器模式的优缺点
优点:
可扩展性比较好,灵活。
增加了新的解释表达式的方式。
易于实现文法。
缺点:
执行效率比较低,可利用场景比较少。
对于复杂的文法比较难维护。