一、概述
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。
解释器模式在开发中,可能比较少用,但是很常见,常见的有SQL解析,表达式解析等。
解释器模式的4种角色:
- 抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。
- 终结符表达式(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()方法。
- 非终结符表达式(Nonterminal Expression)角色:文法中的每一条规则都需要一个具体的非终结符表达式。
- 环境(Context)角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值。
二、优缺点
优点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。
缺点: 1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。 4、解释器模式采用递归调用方法。
三、实现方式
下面以数据内是否包含指定字符串实现一个丐版的SQL解释器为例。
抽象表达式类
public interface Expression {
public boolean interpret(String context);
}
终结符表达式类
public class TerminalExpression implements Expression{
private String data;
public TerminalExpression(String data){
this.data = data;
}
@Override
public boolean interpret(String context) {
if(context.contains(data)){
return true;
}
return false;
}
}
或运算实现类
public class OrExpression implements Expression{
private Expression expr1 = null;
private Expression expr2 = null;
public OrExpression(Expression expr1, Expression expr2){
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) || expr2.interpret(context);
}
}
且运算实现类
public class AndExpression implements Expression{
private Expression expr1 = null;
private Expression expr2 = null;
public AndExpression(Expression expr1, Expression expr2){
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) && expr2.interpret(context);
}
}
客户端
public class Client {
public static void main(String[] args) {
Expression select = new TerminalExpression("Select");
Expression from = new TerminalExpression("From");
Expression isSelectFrom = new AndExpression(select, from);
Expression insert = new TerminalExpression("Insert");
Expression update = new TerminalExpression("Update");
Expression isInsertOrUpdate = new OrExpression(insert, update);
System.out.println(isSelectFrom.interpret("Select"));
System.out.println(isInsertOrUpdate.interpret("Insert"));
System.out.println(isSelectFrom.interpret("Select From"));
System.out.println(isInsertOrUpdate.interpret("Update"));
}
}
输出结果
false
true
true
true
四、常见应用场景
(1)SQL解析器
(2)表达式解析器
(3)符号处理引擎