解釋器模式——用得很少,但還是要了解哈

一、基礎(chǔ)簡介

1、定義

給定一個語言,定義它的文法表示,并定義一個解釋器,這個解釋器使用該標(biāo)識來解釋語言中的句子。

解釋器模式(Interpreter Pattern)提供了評估語言的語法或表達式的方式,它屬于行為型模式。

2、使用場景

  • 1、可以將一個需要解釋執(zhí)行的語言中的句子表示為一個抽象語法樹。
  • 2、一些重復(fù)出現(xiàn)的問題可以用一種簡單的語言來進行表達。
  • 3、一個簡單語法需要解釋的場景。

3、優(yōu)缺點

優(yōu)點: 1、可擴展性比較好,靈活。 2、增加了新的解釋表達式的方式。 3、易于實現(xiàn)簡單文法。

缺點: 1、可利用場景比較少。 2、對于復(fù)雜的文法比較難維護。 3、解釋器模式會引起類膨脹。 4、解釋器模式采用遞歸調(diào)用方法,遞歸是不推薦使用的。

4、模式結(jié)構(gòu)分析

  • ** AbstractExpression(抽象表達式)**:在抽象表達式中聲明了抽象的解釋操作,它是所有終結(jié)符表達式和非終結(jié)符表達式的公共父類。
  • TerminalExpression(終結(jié)符表達式):終結(jié)符表達式是抽象表達式的子類,它實現(xiàn)了與文法中的終結(jié)符相關(guān)聯(lián)的解釋操作,在句子中的每一個終結(jié)符都是該類的一個實例。通常在一個解釋器模式中只有少數(shù)幾個終結(jié)符表達式類,它們的實例可以通過非終結(jié)符表達式組成較為復(fù)雜的句子。
  • NonterminalExpression(非終結(jié)符表達式):非終結(jié)符表達式也是抽象表達式的子類,它實現(xiàn)了文法中非終結(jié)符的解釋操作,由于在非終結(jié)符表達式中可以包含終結(jié)符表達式,也可以繼續(xù)包含非終結(jié)符表達式,因此其解釋操作一般通過遞歸的方式來完成。
  • Context(環(huán)境類):環(huán)境類又稱為上下文類,它用于存儲解釋器之外的一些全局信息,通常它臨時存儲了需要解釋的語句。

二、實例實現(xiàn)

1、實例場景

比如做一個“加法/減法”的通用工具

2、AbstractExpression(抽象表達式)

package com.mfc.design.解釋器模式.四則混合運算;

/**
 * @author MouFangCai
 * @date 2019/10/28 11:01
 *
 * @description AbstractExpression(抽象表達式)
 */
public abstract class Expression {

    /**
     * 以環(huán)境為準(zhǔn),本方法解釋給定的任何一個表達式
     */
    public abstract int interpret(Context ctx);

    /**
     * 將表達式轉(zhuǎn)換成字符串
     */
    public abstract String toString();
}

3、NonterminalExpression(非終結(jié)符表達式)

加法:

package com.mfc.design.解釋器模式.四則混合運算;

/**
 * @author MouFangCai
 * @date 2019/10/28 11:01
 *
 * @description NonterminalExpression(非終結(jié)符表達式)
 */
public class Plus extends Expression {

    private Expression left,right;

    public Plus(Expression left , Expression right){
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret(Context ctx) {

        return left.interpret(ctx) + right.interpret(ctx);
    }

    @Override
    public String toString() {
        return "(" + left.toString() + " + " + right.toString() + ")";
    }

}

減法:

package com.mfc.design.解釋器模式.四則混合運算;

/**
 * @author MouFangCai
 * @date 2019/10/28 11:04
 *
 * @description NonterminalExpression(非終結(jié)符表達式)
 */
public class Minus extends Expression {

    private Expression left, right;

    public Minus(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret(Context ctx) {

        return left.interpret(ctx) - right.interpret(ctx);
    }

    @Override
    public String toString() {
        return "(" + left.toString() + " - " + right.toString() + ")";
    }
}

4、TerminalExpression(終結(jié)符表達式)

package com.mfc.design.解釋器模式.四則混合運算;

/**
 * @author MouFangCai
 * @date 2019/10/28 11:01
 *
 * @description TerminalExpression(終結(jié)符表達式)
 */
public class Constant extends Expression {

    private int value;

    public Constant(int value){
        this.value = value;
    }

    @Override
    public int interpret(Context ctx) {

        return value;
    }

    @Override
    public String toString() {
        return new Integer(value).toString();
    }

}

5、Context(環(huán)境類):環(huán)境類又稱為上下文類

package com.mfc.design.解釋器模式.四則混合運算;

/**
 * @author MouFangCai
 * @date 2019/10/28 11:01
 *
 * @description Context(環(huán)境類):環(huán)境類又稱為上下文類
 */
public class Context {

}

6、客戶端

package com.mfc.design.解釋器模式.四則混合運算;

/**
 * @author MouFangCai
 * @date 2019/10/28 11:04
 * @description
 */
public class Client {

    public static void main(String[] args) {
        Context context = new Context();
        Constant c1 = new Constant(1);
        Constant c2 = new Constant(2);
        Constant c3 = new Constant(3);
        Constant c4 = new Constant(4);
        Expression exp = new Minus(new Plus(c3, c2), new Minus(c4, c1));
        System.out.println(exp.toString() + "=" + exp.interpret(context));
    }

}

8、結(jié)果展示

((3 + 2) - (4 - 1))=2

Process finished with exit code 0

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容