【設計模式】(三十)--行爲型模式--解釋器模式

【設計模式】(三十)–行爲型模式–解釋器模式

解釋器模式定義

Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.

意思是:給定一門語言,定義法的文法的一種表示,並定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。

解釋器模式基於以下五個元素:

  • Abstract Expression 抽象表達式,定義個了一個 解釋操作的方法
  • Terminal Expression 終結符表達式,實現了抽象表達式的方法,文法中的每一個終結符都有一個具體的終結表達式與之對應。
  • Nonterminal Expression 非終結符表達式,實現了抽象表達式的方法,文法中的每一條規則都對應一個非終結符表達式類。
  • Context 環境,提供瞭解釋器之外的一些全局信息。

解釋器模式的優點

  • 1、可擴展性比較好,靈活。
  • 2、增加了新的解釋表達式的方式。
  • 3、易於實現簡單文法。

解釋器模式也有以下缺點:

  • 1、可利用場景比較少。
  • 2、對於複雜的文法比較難維護。
  • 3、解釋器模式會引起類膨脹。
  • 4、解釋器模式採用遞歸調用方法

解釋器模式的使用場景

  • 1、可以將一個需要解釋執行的語言中的句子表示爲一個抽象語法樹。
  • 2、一些重複出現的問題可以用一種簡單的語言來進行表達。
  • 3、一個簡單語法需要解釋的場景。

解釋器模式的簡單實現

類圖
在這裏插入圖片描述
實現

public class Test {
    public static void main(String[] args) {
        Variable multiplier = new Variable(2);
        Variable multiplicand = new Variable(5);
        ArithmeticExpression plus = new MultiplyExpression(multiplier, multiplicand);
        plus.interpret();
    }
}
/**
 * 參數
 */
public class Variable implements ArithmeticExpression {
    private int value;

    @Override
    public int interpret() {
        System.out.println("獲取參數" + value);
        return value;
    }

    public Variable(int value) {
        this.value = value;
    }
}
/**
 * 算數表達式
 */
public interface ArithmeticExpression {
    int interpret();
}
public class MultiplyExpression implements ArithmeticExpression {

    private ArithmeticExpression multiplier;
    private ArithmeticExpression multiplicand;


    @Override
    public int interpret() {
        System.out.println("執行乘法表達式");
        int multiplierValue = multiplier.interpret();
        int multiplicandValue = multiplicand.interpret();
        int result = multiplierValue * multiplicandValue;
        System.out.println("執行結果:" + result);
        return result;
    }

    public MultiplyExpression(ArithmeticExpression multiplier, ArithmeticExpression multiplicand) {
        this.multiplier = multiplier;
        this.multiplicand = multiplicand;
    }
}

結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章