【設計模式】(三十)–行爲型模式–解釋器模式
解釋器模式定義
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;
}
}
結果