【設計模式學習筆記】直譯器模式
阿新 • • 發佈:2018-12-31
直譯器模式,最經典的直譯器模型就是我們用的那些IDE。將你編寫的語言轉成機器語言。這個轉換就可以理解為解釋。
文章目錄
1.1 模型結構
直譯器模型,有三個主要的角色。
- Context:環境角色,主要用於存放傳入的資料。
- AbstractExpress:抽象直譯器,是所有直譯器的介面或者抽象父類。
- TerminalExpress:終結符表示式,主要解釋文法。
- NonTermianlExpress: 非終結符表示式,主要解釋符號標記。
比如:select * from database where name = #{name}
select,from,where [a-z_A-Z]* =,是非終結表示式。database,*,#{name}這樣的就屬於終結表示式。
下面看看我這個例子吧。笑笑就好~實在拙劣。。。
1.2 環境角色
package interpretor;
/************************************************
*@ClassName : Context
*@Description : TODO
*@Author : NikolaZhang
*@Date : 【2018/12/15 0015 13:24】
*@Version : 1.0.0
*************************************************/
public class Context {
private String condition;
private String value;
private String expression;
public Context(String condition, String value, String expression) {
this.condition = condition;
this.value = value;
this.expression = expression;
}
public String getCondition() {
return condition;
}
public String getValue() {
return value;
}
public String getExpression() {
return expression;
}
}
1.3 抽象表示式介面
package interpretor;
/************************************************
*@ClassName : Expression
*@Description : TODO
*@Author : NikolaZhang
*@Date : 【2018/12/15 0015 9:27】
*@Version : 1.0.0
*************************************************/
public interface Expression {
void interpreter(Context context);
}
1.4 終結和非終結表示式實現
package interpretor;
/************************************************
*@ClassName : TerminalExpression
*@Description : TODO
*@Author : NikolaZhang
*@Date : 【2018/12/15 0015 9:29】
*@Version : 1.0.0
*************************************************/
public class TerminalExpression implements Expression {
@Override
public void interpreter(Context context) {
String name = context.getCondition();
String value = context.getValue();
System.out.println("查詢條件為name="+name);
System.out.println("需要的結果是:"+value);
if("age".equals(value) && "zhangsan".equals(name)){
System.out.println("查詢年齡為:23");
}
}
}
package interpretor;
/************************************************
*@ClassName : NonTerminalExpression
*@Description : TODO
*@Author : NikolaZhang
*@Date : 【2018/12/15 0015 9:29】
*@Version : 1.0.0
*************************************************/
public class NonTerminalExpression implements Expression {
private Expression expression;
public NonTerminalExpression(Expression expression) {
this.expression = expression;
}
@Override
public void interpreter(Context context) {
String str = context.getExpression();
if(str.contains("select") && str.contains("where")&& str.contains("=")){
System.out.println("ooo條件查詢");
this.expression.interpreter(context);
}
}
}
1.5 測試
package interpretor;
/************************************************
*@ClassName : Test
*@Description : TODO
*@Author : NikolaZhang
*@Date : 【2018/12/15 0015 9:30】
*@Version : 1.0.0
*************************************************/
public class Test {
public static void main(String[] args) {
String input = "select _value where name = _name";
Context context = new Context("zhangsan", "age", input);
Expression tExp = new TerminalExpression();
Expression ntExp = new NonTerminalExpression(tExp);
ntExp.interpreter(context);
}
}
1.6 結果
參考
【菜鳥教程】:http://www.runoob.com/design-pattern/interpreter-pattern.html