解释器设计模式是行为设计模式的一种。解释器模式用于定义语言的语法表示,并提供解释器来处理该语法。
- 这种模式涉及实现一个表达式接口,它告诉解释特定的上下文。该模式用于 SQL 解析、符号处理引擎等。
- 此模式在表达式层次结构上执行。这里的每个表达式都是终结符或非终结符。
- 解释器设计模式的树结构有点类似于复合设计模式定义的树结构,终端表达式是叶对象,非终端表达式是复合的。
- 该树包含要评估的表达式,通常由解析器生成。解析器本身不是解释器模式的一部分。
例如 :
这是“+ – 9 8 7”的表达式层次结构:
实现解释器模式
UML 图解释器设计模式
设计组件
- AbstractExpression (Expression):声明一个解释器()操作,AST中的所有节点(终端和非终端)都覆盖。
- TerminalExpression (NumberExpression):实现对终端表达式的 interpret() 操作。
- NonterminalExpression (AdditionExpression、SubtractionExpression 和 MultiplicationExpression):为所有非终结符表达式实现 interpret() 操作。
- 上下文(字符串):包含解释器全局的信息。正是这个带有 Postfix 符号的 String 表达式必须被解释和解析。
- 客户端(ExpressionParser):构建(或提供)从 TerminalExpression 和 NonTerminalExpression 组装的 AST。客户端调用 interpret() 操作。
让我们看一个解释器设计模式的例子。
// Expression interface used to
// check the interpreter.
interface Expression
{
boolean interpreter(String con);
}
// TerminalExpression class implementing
// the above interface. This interpreter
// just check if the data is same as the
// interpreter data.
class TerminalExpression implements Expression
{
String data;
public TerminalExpression(String data)
{
this.data = data;
}
public boolean interpreter(String con)
{
if(con.contains(data))
{
return true;
}
else
{
return false;
}
}
}
// OrExpression class implementing
// the above interface. This interpreter
// just returns the or condition of the
// data is same as the interpreter data.
class OrExpression implements Expression
{
Expression expr1;
Expression expr2;
public OrExpression(Expression expr1, Expression expr2)
{
this.expr1 = expr1;
this.expr2 = expr2;
}
public boolean interpreter(String con)
{
return expr1.interpreter(con) || expr2.interpreter(con);
}
}
// AndExpression class implementing
// the above interface. This interpreter
// just returns the And condition of the
// data is same as the interpreter data.
class AndExpression implements Expression
{
Expression expr1;
Expression expr2;
public AndExpression(Expression expr1, Expression expr2)
{
this.expr1 = expr1;
this.expr2 = expr2;
}
public boolean interpreter(String con)
{
return expr1.interpreter(con) && expr2.interpreter(con);
}
}
// Driver class
class InterpreterPattern
{
public static void main(String[] args)
{
Expression person1 = new TerminalExpression("Kushagra");
Expression person2 = new TerminalExpression("Lokesh");
Expression isSingle = new OrExpression(person1, person2);
Expression vikram = new TerminalExpression("Vikram");
Expression committed = new TerminalExpression("Committed");
Expression isCommitted = new AndExpression(vikram, committed);
System.out.println(isSingle.interpreter("Kushagra"));
System.out.println(isSingle.interpreter("Lokesh"));
System.out.println(isSingle.interpreter("Achint"));
System.out.println(isCommitted.interpreter("Committed, Vikram"));
System.out.println(isCommitted.interpreter("Single, Vikram"));
}
}
输出:
true
true
false
true
false
在上面的代码中,我们正在创建一个接口Expression和实现 Expression 接口的具体类。定义了一个类TerminalExpression作为主解释器,其他类OrExpression , AndExpression用于创建组合表达式。
好处
- 很容易改变和扩展语法。由于模式使用类来表示语法规则,因此您可以使用继承来更改或扩展语法。现有表达式可以增量修改,新表达式可以定义为旧表达式的变体。
- 实现语法也很容易。在抽象语法树中定义节点的类具有类似的实现。这些类易于编写,并且通常可以使用编译器或解析器生成器自动生成它们。
缺点
- 复杂的语法很难维护。解释器模式为文法中的每个规则至少定义一个类。因此,包含许多规则的语法很难管理和维护。