解釋器模式使用頻率並不高,優勢在於可以使用語法規則解析不少複雜的句子,語法規則可能簡單,也可能容易,例如正則表達式來匹配數字字符串。正則表達式
是一種按照規定語法進行解析的方案,現實項目中使用偏少,其定義是,給定一門語言,定義它的文法的一種表示,並定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。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