解釋器模式

前言

解釋器模式使用頻率並不高,優勢在於可以使用語法規則解析不少複雜的句子,語法規則可能簡單,也可能容易,例如正則表達式來匹配數字字符串。正則表達式

目錄

1、定義

是一種按照規定語法進行解析的方案,現實項目中使用偏少,其定義是,給定一門語言,定義它的文法的一種表示,並定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。markdown

2、模式原理分析

//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
複製代碼

3、使用場景

  • 重複發生的問題能夠使用解釋器模式ide

  • 一個簡單語法須要解釋的場景,不過目前某些標準語法轉化基本都被一些工具類所替換工具

4、優勢

  • 容易擴展,修改語法,只須要修改響應的非終結表達式,擴展語法,只須要增長非終結表達式類便可

5、缺點

  • 執行效率低this

  • 解釋器模式會引發類膨脹,維護成本高spa

  • 解釋器模式採用遞歸調用方法,每一個表達式須要知道最終的結果,必須一層層的往下剝3d

相關文章
相關標籤/搜索