1、模式定義
解釋器模式(Interpreter Pattern) :定義語言的文法,而且建立一個解釋器來解釋該語言中的句子。這裡的“語言”意思是使用規定格式和文法的代碼,它是一種類行為型模式。
2、模式結構
解釋器模式包括例如以下角色:
AbstractExpression: 抽象表達式
TerminalExpression: 終結符表達式
NonterminalExpression: 非終結符表達式
Context: 環境類
Client: 客戶類
3、模式分析
解釋器模式描寫叙述了怎樣為簡單的語言定義一個文法,怎樣在該語言中表示一個句子,以及怎樣解釋這些句子。
文法規則執行個體:
expression ::= value | symbol
symbol ::= expression '+' expression | expression '-' expression
value ::= an integer //一個整數值
在文法規則定義中能夠使用一些符号來表示不同的含義。如使用“|”表示或。使用“{”和“}”表示組合。使用“*”表示出現0次或多次等,當中使用頻率最高的符号是表示或關系的“|” 。
抽象文法樹描寫叙述了怎樣構成一個複雜的句子,通過對抽象文法樹的分析。能夠識别出語言中的終結符和非終結符類。
在解釋器模式中,每一種終結符和非終結符都有一個詳細類與之相應,正由于使用類來表示每個文法規則,使得系統具有較好的擴充性和靈活性。
典型的抽象表達式類實作代碼:
public abstract class AbstractExpression
{
public abstract void interpret(Context ctx);
}
典型的終結符表達式類實作代碼:
public class TerminalExpression extends AbstractExpression
{
public void interpret(Context ctx)
{
//對于終結符表達式的解釋操作
}
}
典型的非終結符表達式類實作代碼:
public class NonterminalExpression extends AbstractExpression
{
private AbstractExpression left;
private AbstractExpression right;
public NonterminalExpression(AbstractExpression left,AbstractExpression right)
{
this.left=left;
this.right=right;
}
public void interpret(Context ctx)
{
//遞歸調用每個組成部分的interpret()方法
//在遞歸調用時指定組成部分的連接配接方式。即非終結符的功能
}
}
典型的環境類實作代碼:
public class Context
{
private HashMap map = new HashMap();
public void assign(String key, String value)
{
//往環境類中設值
}
public String lookup(String key)
{
//擷取存儲在環境類中的值
}
}
4、模式優缺點
解釋器模式的長處
易于改變和擴充文法。
易于實作文法。
添加了新的解釋表達式的方式。
解釋器模式的缺點
對于複雜文法難以維護。
運作效率較低。
應用場景非常有限
5、模式适用環境
在下面情況下能夠使用解釋器模式:
能夠将一個須要解釋運作的語言中的句子表示為一個抽象文法樹。
一些反複出現的問題能夠用一種簡單的語言來進行表達。
文法較為簡單。
效率不是關鍵問題。