解释器模式定义
解释器模式定义:这种模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子。
解释器模式这种模式被用在大家最为熟悉的,比如: SQL 解析、符号处理引擎等。
解释器模式角色
解释器模式包含5大角色,解释器模式uml图如下图所示:
1.抽象表达式Abstract Expression角色
抽象表达式:主要定义解释器的接口,约定解释器的解释操作。
2.终结符表达式Terminal Expression角色
终结符表达式:主要是抽象表达式的子类,用来实现文法中与终结符相关的操作。
3.非终结符表达式Nonterminal Expression角色
非终结符表达式:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。
4.环境Context角色
环境:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据。
5.客户端Client角色
客户端:主要任务是将需要分析的句子或表达式,转换成使用解释器对象描述的抽象语法树。
解释器模式案例
通过解释器模式实现一个逻辑与和逻辑或的语法翻译器,用于翻译问题内容,来看一下解释器的UML类图 。
如下图所示:
再来看一下代码如何实现:
1.先定义一个语法表达式接口Expression
public interface Expression {
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;
}
}
2.定义OrExpression语法翻译器
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) || expr1.interpret(context);
}
}
3.定义AndExpression语法翻译器
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);
}
}
4.定义客户端
public class InterpreterPatternDemo {
//Rule: Robert and John are male
public static Expression getMaleExpression(){
Expression robert = new TerminalExpression("Robert");
Expression john = new TerminalExpression("John");
return new OrExpression(robert,john);
}
//Rule: Julie is a married women
public static Expression getMarriedWomanExpression(){
Expression julie = new TerminalExpression("Julie");
Expression married = new TerminalExpression("Married");
return new AndExpression(julie,married);
}
public static void main(String[] args){
Expression isMale = getMaleExpression();
Expression isMarriedWoman = getMarriedWomanExpression();
System.out.println("John is male?" isMale.interpret("John"));
System.out.println("Julie is a married women?" isMarriedWoman.interpret("Married Julie"));
}
}
解释器模式应用场景
当有一个语言需要解释执行,并且可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式,例如:
- MySQL中的SQL语句 解析;
- JDK中Pattern对正则表达式的编译和解析;
- Spring中ExpressionParser接口的使用;
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》