設(shè)計(jì)模式-解釋器模式

一、定義

解釋器模式(Interpreter Pattern)是一種按照規(guī)定語法進(jìn)行解析的方案,在現(xiàn)在項(xiàng)目中使 用較少,其定義如下:Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.(給定一門語言,定義 它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來解釋語言中的句子。)

解釋器模式的通用類圖如圖所示。

解釋器模式通用類圖
  • AbstractExpression——抽象解釋器

具體的解釋任務(wù)由各個(gè)實(shí)現(xiàn)類完成,具體的解釋器分別由TerminalExpression和Non-terminalExpression完成。

  • TerminalExpression——終結(jié)符表達(dá)式

實(shí)現(xiàn)與文法中的元素相關(guān)聯(lián)的解釋操作,通常一個(gè)解釋器模式中只有一個(gè)終結(jié)符表達(dá) 式,但有多個(gè)實(shí)例,對(duì)應(yīng)不同的終結(jié)符。

  • NonterminalExpression——非終結(jié)符表達(dá)式

文法中的每條規(guī)則對(duì)應(yīng)于一個(gè)非終結(jié)表達(dá)式,具體到我們的例子就是加減法規(guī)則分別對(duì)應(yīng)到AddExpression和SubExpression兩個(gè)類。非終結(jié)符表達(dá)式根據(jù)邏輯的復(fù)雜程度而增加,原則上每個(gè)文法規(guī)則都對(duì)應(yīng)一個(gè)非終結(jié)符表達(dá)式。

  • Context——環(huán)境角色
//抽象表達(dá)式

public abstract class Expression {
    //每個(gè)表達(dá)式必須有一個(gè)解析任務(wù)
    public abstract Object interpreter(Context ctx);
}

//終結(jié)符表達(dá)式

public class TerminalExpression extends Expression {     
    //通常終結(jié)符表達(dá)式只有一個(gè),但是有多個(gè)對(duì)象
    public Object interpreter(Context ctx) {
        return null;
    }
}

//非終結(jié)符表達(dá)式

public class NonterminalExpression extends Expression { 
    //每個(gè)非終結(jié)符表達(dá)式都會(huì)對(duì)其他表達(dá)式產(chǎn)生依賴
    public NonterminalExpression(Expression... expression){ }

    public Object interpreter(Context ctx) {
        //進(jìn)行文法處理
        return null; 
    }
}

//客戶類

public class Client {
    public static void main(String[] args) {
        Context ctx = new Context(); 
        //通常定一個(gè)語法容器,容納一個(gè)具體的表達(dá)式,通常為L(zhǎng)istArray、LinkedList、Stack等類型
        Stack&Expression> stack = null;
        for(;;){
            //進(jìn)行語法判斷,并產(chǎn)生遞歸調(diào)用
        }
        
        //產(chǎn)生一個(gè)完整的語法樹,由各個(gè)具體的語法分析進(jìn)行解析
        Expression exp = stack.pop(); 
        //具體元素進(jìn)入場(chǎng)景
        exp.interpreter(ctx);
    }
}

二、應(yīng)用

2.1 優(yōu)點(diǎn)

解釋器是一個(gè)簡(jiǎn)單語法分析工具,它最顯著的優(yōu)點(diǎn)就是擴(kuò)展性,修改語法規(guī)則只要修改 相應(yīng)的非終結(jié)符表達(dá)式就可以了,若擴(kuò)展語法,則只要增加非終結(jié)符類就可以了。

2.2 缺點(diǎn)

  • 解釋器模式會(huì)引起類膨脹

每個(gè)語法都要產(chǎn)生一個(gè)非終結(jié)符表達(dá)式,語法規(guī)則比較復(fù)雜時(shí),就可能產(chǎn)生大量的類文 件,為維護(hù)帶來了非常多的麻煩。

  • 解釋器模式采用遞歸調(diào)用方法

每個(gè)非終結(jié)符表達(dá)式只關(guān)心與自己有關(guān)的表達(dá)式,每個(gè)表達(dá)式需要知道最終的結(jié)果,必 須一層一層地剝繭,無論是面向過程的語言還是面向?qū)ο蟮恼Z言,遞歸都是在必要條件下使 用的,它導(dǎo)致調(diào)試非常復(fù)雜。想想看,如果要排查一個(gè)語法錯(cuò)誤,我們是不是要一個(gè)斷點(diǎn)一 個(gè)斷點(diǎn)地調(diào)試下去,直到最小的語法單元。

  • 效率問題

解釋器模式由于使用了大量的循環(huán)和遞歸,效率是一個(gè)不容忽視的問題,特別是一用于 解析復(fù)雜、冗長(zhǎng)的語法時(shí),效率是難以忍受的。

2.3 場(chǎng)景

  • 重復(fù)發(fā)生的問題可以使用解釋器模式

例如,多個(gè)應(yīng)用服務(wù)器,每天產(chǎn)生大量的日志,需要對(duì)日志文件進(jìn)行分析處理,由于各 個(gè)服務(wù)器的日志格式不同,但是數(shù)據(jù)要素是相同的,按照解釋器的說法就是終結(jié)符表達(dá)式都 是相同的,但是非終結(jié)符表達(dá)式就需要制定了。在這種情況下,可以通過程序來一勞永逸地 解決該問題。

  • 一個(gè)簡(jiǎn)單語法需要解釋的場(chǎng)景
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,430評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,134評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,653評(píng)論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,136評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,372評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,888評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,738評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,939評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,179評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評(píng)論 1 283
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,610評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,916評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容