定義
給定一個(gè)語(yǔ)言,定義它的文法的一種表示这弧,并定義一個(gè)解釋器娃闲,該解釋器使用該表示來(lái)解釋語(yǔ)言中的句子。
使用場(chǎng)景
(1)某個(gè)簡(jiǎn)單的語(yǔ)言需要解釋執(zhí)行而且可以將該語(yǔ)言中的語(yǔ)句表示為一個(gè)抽象語(yǔ)法樹時(shí)
(2)在某些特定的領(lǐng)域出現(xiàn)不斷重復(fù)的問題時(shí)匾浪,可以將該領(lǐng)域的問題轉(zhuǎn)化為一種語(yǔ)法規(guī)則下的語(yǔ)句皇帮,然后構(gòu)建解釋器來(lái)解釋該語(yǔ)句。
UML類圖
實(shí)現(xiàn)方式
符號(hào)表達(dá)式抽象類
public abstract class AbstractExpression{
? ? public abstract int interpret(Context ctx);
}
終端符號(hào)表達(dá)式類
public class TerminalExpression extends AbstractExpression{
? ? @Override
? ? public int interpret(Context ctx){
? ? ? ? return ctx.a;
? ? };
}
非終端符號(hào)表達(dá)式類
public class NonterminalExpression extends AbstractExpression{
? ? @Override
? ? public intinterpret(Context ctx){
? ? ? ? //do sth, e.g.Addition
? ? ? ? return ctx.a + ctx.b;
? ? };
}
上下文環(huán)境類
public class Context{
? ? public int a,b;
}
處理類
public class Client{
? ? public static void main(String [] args){
? ? ? ? //...
? ? }
}
解釋器模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
>具有靈活的擴(kuò)展性属拾,當(dāng)想對(duì)文法規(guī)則進(jìn)行擴(kuò)展延伸時(shí),只需要增加相應(yīng)的非終結(jié)符解釋器冷溶,并在構(gòu)建抽象語(yǔ)法樹時(shí)渐白,使用新增的解釋器對(duì)象進(jìn)行具體的解釋即可
缺點(diǎn)
>會(huì)生成大量的解釋器類,導(dǎo)致后期維護(hù)困難
>對(duì)于國(guó)語(yǔ)復(fù)雜的文法逞频,構(gòu)建抽象語(yǔ)法樹會(huì)顯得很繁瑣纯衍。
Android中的解釋器模型舉例
Android系統(tǒng)源碼中基本沒有經(jīng)典的解釋器模式實(shí)現(xiàn),但是PackageParser等類應(yīng)用了解釋器模式的原理進(jìn)行實(shí)現(xiàn)虏劲。
——2017.08.29