解釋器模式(Interpreter)

1、概念

解釋器模式給定一個(gè)語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來(lái)解釋語(yǔ)言中的句子,屬于行為型模式。但其在實(shí)際的系統(tǒng)開(kāi)發(fā)中使用的很少,因?yàn)樗麜?huì)引起效率、性能以及維護(hù)等問(wèn)題


解釋器模式

2、模式結(jié)構(gòu)

  • 抽象解釋器(AbstractExpression):聲明一個(gè)所有的具體表達(dá)式角色都需要實(shí)現(xiàn)的抽象接口。這個(gè)接口主要是一個(gè)interpret()方法,稱作解釋操作
  • 終結(jié)符表達(dá)式(TerminalExpression):實(shí)現(xiàn)了抽象表達(dá)式角色所要求的接口,主要是一個(gè)interpret()方法;文法中的每一個(gè)終結(jié)符都有一個(gè)具體終結(jié)表達(dá)式與之相對(duì)應(yīng)
  • 非終結(jié)符表達(dá)式(NonterminalExpression):文法中的每一條規(guī)則都需要一個(gè)具體的非終結(jié)符表達(dá)式,非終結(jié)符表達(dá)式一般是文法中的運(yùn)算符或者其他關(guān)鍵
  • 環(huán)境類(Context):用來(lái)存放文法中各個(gè)終結(jié)符所對(duì)應(yīng)的具體值

3、使用場(chǎng)景

  • 可以將一個(gè)需要解釋執(zhí)行的語(yǔ)言中的句子表示為一個(gè)抽象語(yǔ)法樹(shù)
  • 一些重復(fù)出現(xiàn)的問(wèn)題可以用一種簡(jiǎn)單的語(yǔ)言來(lái)進(jìn)行表達(dá)
  • 一個(gè)簡(jiǎn)單語(yǔ)法需要解釋的場(chǎng)景

4、優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • 可擴(kuò)展性比較好,靈活
  • 增加了新的解釋表達(dá)式的方式
  • 易于實(shí)現(xiàn)文法

缺點(diǎn):

  • 可利用場(chǎng)景比較少
  • 對(duì)于復(fù)雜的文法比較難維護(hù)
  • 解釋器模式會(huì)引起類膨脹
  • 解釋器模式采用遞歸調(diào)用方法

5、實(shí)例

定義環(huán)境類Context

public class Context {
    private Map<Expression, Integer> valueMap;

    public Context() {
        this.valueMap = new HashMap<>();
    }

    public void addValue(Expression ex, Integer value) {
        valueMap.put(ex, value);
    }

    public int getValue(Expression ex) {
        if (valueMap.containsKey(ex)) {
            return valueMap.get(ex);
        }
        return 0;
    }
}

定義抽象解釋器Expression

public interface Expression {
    int interpreter(Context context);
}

定義終結(jié)符表達(dá)式TerminalExpression

public class TerminalExpression implements Expression {

    private int number;

    public TerminalExpression(int number) {
        this.number = number;
    }

    @Override
    public int interpreter(Context context) {
        return number;
    }
}

定義終結(jié)符表達(dá)式VariableExpression

public class VariableExpression implements Expression {

    @Override
    public int interpreter(Context context) {
        return context.getValue(this);
    }
}

定義非終結(jié)符表達(dá)式MinusExpression

public class MinusExpression implements Expression {
    private Expression left;
    private Expression right;

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

    @Override
    public int interpreter(Context context) {
        return left.interpreter(context) - right.interpreter(context);
    }
}

定義非終結(jié)符表達(dá)式AddExpression

public class AddExpression implements Expression {

    private Expression left;
    private Expression right;

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

    @Override
    public int interpreter(Context context) {
        return left.interpreter(context) + right.interpreter(context);
    }
}

客戶端使用

Context context = new Context();
VariableExpression x = new VariableExpression();
VariableExpression y = new VariableExpression();
TerminalExpression terminal = new TerminalExpression(100);
context.addValue(x, 20);
context.addValue(y, 50);
Expression expression = new AddExpression(new MinusExpression(x, y), terminal);
System.out.println("Result = " + expression.interpreter(context));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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