解釋器模式(interpreter) ,給定一個(gè)語言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來解釋語言中的句子。
解釋器模式的結(jié)構(gòu)圖
解釋器模式中的角色:
- Context:包含解釋器之外的一些全局信息
- AbstractExpression:抽象表達(dá)式,聲明一個(gè)抽象的解釋操作,這個(gè)接口為抽象語法樹中所有的結(jié)點(diǎn)所共享。
- TerminalExpression:終結(jié)符表達(dá)式,實(shí)現(xiàn)與文法中的終結(jié)符相關(guān)聯(lián)的解釋操作。
- NonterminalExpression:非終結(jié)符表達(dá)式,為文法中的非終結(jié)符號(hào),為文法中的非終結(jié)符實(shí)現(xiàn)解釋操作。對(duì)文法中每一條規(guī)則 R1、R2...Rm 都需要一個(gè)具體的非終結(jié)符表達(dá)式類。
解釋器模式的簡(jiǎn)單實(shí)現(xiàn)
(1)Context 類
public class Client {
public static void main(String[] args) {
Context context = new Context();
List<AbstractExpression> abstractExpressionList = new ArrayList<>();
abstractExpressionList.add(new TerminalExpression());
abstractExpressionList.add(new NonterminalExpression());
abstractExpressionList.add(new TerminalExpression());
abstractExpressionList.add(new TerminalExpression());
for (AbstractExpression abstractExpression : abstractExpressionList) {
abstractExpression.interpret(context);
}
}
}
(2)抽象表達(dá)式
public abstract class AbstractExpression {
public abstract void interpret(Context context);
}
(3)終結(jié)符表達(dá)式
public class TerminalExpression extends AbstractExpression {
@Override
public void interpret(Context context) {
System.out.println("終端解釋器");
}
}
(4)非終結(jié)符表達(dá)式
public class NonterminalExpression extends AbstractExpression {
@Override
public void interpret(Context context) {
System.out.println("非終端解釋器");
}
}
解釋器模式的應(yīng)用場(chǎng)景
應(yīng)用場(chǎng)景:
當(dāng)語言的文法較為簡(jiǎn)單,且執(zhí)行效率不是關(guān)鍵問題時(shí)。
當(dāng)問題重復(fù)出現(xiàn),且可以用一種簡(jiǎn)單的語言來進(jìn)行表達(dá)時(shí)。
當(dāng)一個(gè)語言需要解釋執(zhí)行,并且語言中的句子可以表示為一個(gè)抽象語法樹的時(shí)候,如 XML 文檔解釋。
解釋器模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
可擴(kuò)展性比較好,靈活。
增加了新的解釋表達(dá)式的方式。
易于實(shí)現(xiàn)文法。
缺點(diǎn):
執(zhí)行效率比較低,可利用場(chǎng)景比較少。
對(duì)于復(fù)雜的文法比較難維護(hù)。