1. 程式人生 > >【設計模式學習筆記】直譯器模式

【設計模式學習筆記】直譯器模式

直譯器模式,最經典的直譯器模型就是我們用的那些IDE。將你編寫的語言轉成機器語言。這個轉換就可以理解為解釋。

文章目錄

1.1 模型結構

直譯器模型,有三個主要的角色。

  1. Context:環境角色,主要用於存放傳入的資料。
  2. AbstractExpress:抽象直譯器,是所有直譯器的介面或者抽象父類。
  3. TerminalExpress:終結符表示式,主要解釋文法。
  4. 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