解释器模式使用频率并不高,优势在于可以使用语法规则解析不少复杂的句子,语法规则可能简单,也可能容易,例如正则表达式来匹配数字字符串。正则表达式
是一种按照规定语法进行解析的方案,现实项目中使用偏少,其定义是,给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。markdown
//1.抽象表达式
public interface Expression {
boolean interpreter(String con);
}
//2.终结符表达式
public class TerminalExpression implements Expression{
String data;
public TerminalExpression(String data) {
this.data = data;
}
@Override
public boolean interpreter(String con) {
if(con.contains(data)) {
return true;
} else {
return false;
}
}
}
//3.1 非终结表达式
public 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);
}
}
//3.2 非终结表达式
public 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);
}
}
//3.3 非终结表达式
public 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);
}
}
//4. 场景类
public class Client {
public static void main(String[] args) {
Expression person1 = new TerminalExpression("mick");
Expression person2 = new TerminalExpression("mia");
Expression isSingle = new OrExpression(person1, person2);
Expression spike = new TerminalExpression("spike");
Expression mock = new TerminalExpression("mock");
Expression isCommitted = new AndExpression(spike, mock);
System.out.println(isSingle.interpreter("mick"));
System.out.println(isSingle.interpreter("mia"));
System.out.println(isSingle.interpreter("max"));
System.out.println(isCommitted.interpreter("mock, spike"));
System.out.println(isCommitted.interpreter("Single, mock"));
}
}
//输出结果
true
true
false
true
false
复制代码
重复发生的问题能够使用解释器模式ide
一个简单语法须要解释的场景,不过目前某些标准语法转化基本都被一些工具类所替换工具
执行效率低this
解释器模式会引发类膨胀,维护成本高spa
解释器模式采用递归调用方法,每一个表达式须要知道最终的结果,必须一层层的往下剥3d