如何讓孩子愛上設(shè)計模式 ——20.解釋器模式(Interpreter Pattern)

標簽: 設(shè)計模式初涉


描述性文字

解釋器模式是一個用的比較少的設(shè)計模式迟蜜,而且不太好理解,先說下概念相關(guān)的東西
再寫個代碼示例幫助下理解:

定義

給定一個語言之后,解釋器模式可以定義出其文法的一種表示,并同時提供一個
解釋器,客戶端可以使用這個解釋器來解釋這個語言中的句子呆万。

四個角色

  • AbstractExpression抽象表達式,聲明一個所有具體表達式都要實現(xiàn)的接口车份,
    接口中主要是一個interpret()方法谋减,稱為解釋操作,具體的解釋任務(wù)由他的各個實現(xiàn)
    類來完成扫沼,而具體的解釋器又分別由 終結(jié)符解釋器非終結(jié)符解釋器 完成出爹。

  • TerminalExpression終結(jié)符表達式,實現(xiàn)與文法中的元素相關(guān)聯(lián)的解釋操作缎除,
    通常一個解釋器模式中只有一個終結(jié)符表達式严就,但有多個實例,對應(yīng)不同的終結(jié)符器罐。梢为、
    終結(jié)符一半是文法中的運算單元,比如有一個簡單的公式R=R1+R2轰坊,在里面R1和R2就是終結(jié)符铸董,
    對應(yīng)的解析R1和R2的解釋器就是終結(jié)符表達式。

  • NonterminalExpression非終結(jié)符表達式肴沫,文法中的每條規(guī)則對應(yīng)于一個非終
    結(jié)符表達式粟害,非終結(jié)符表達式一般是文法中的運算符或者其他關(guān)鍵字,比如公式R=R1+R2中樊零,
    +就是非終結(jié)符我磁,解析+的解釋器就是一個非終結(jié)符表達式。非終結(jié)符表達式根據(jù)邏輯的復(fù)雜
    程度而增加驻襟,原則上每個文法規(guī)則都對應(yīng)一個非終結(jié)符表達式。

  • Context上下文環(huán)境芋哭,存放文法中各個終結(jié)符所對應(yīng)的具體值沉衣,比如R=R1+R2,我們
    給R1賦值100减牺,給R2賦值200豌习。這些信息需要存放到環(huán)境角色中存谎,很多情況下我們使用Map來充
    當(dāng)環(huán)境角色就足夠了。

UML類圖

優(yōu)缺點

優(yōu)點

  • 1.易于實現(xiàn)簡易語法肥隆,一條語法規(guī)則用一個解釋器對象解釋執(zhí)行
  • 2.易于擴展新的語法既荚,只需創(chuàng)建相應(yīng)的解釋器對象,在創(chuàng)建抽象語法樹的時候使用即可栋艳。
  • 3.增加了新的解釋表達式的方式

缺點

  • 1.可使用場景較少
  • 2.對于復(fù)雜的文法比較難維護
  • 3.引起類膨脹
  • 4.采用遞歸調(diào)用方法恰聘,效率,性能吸占,維護問題

使用場景

  • 1.重復(fù)發(fā)生的問題
  • 2.一個簡單語法需要解釋的場景
  • 3.將一個解釋執(zhí)行的語言中的句子表示為一個抽象語法樹

代碼示例

定義一個能夠解釋加減法的解釋器作為示例

先定義抽象表達式

接著定義加減法兩個非終結(jié)符表達式

再接著定義常量與變量兩個終結(jié)符表達式

然后定義上下文環(huán)境晴叨,用Map存放各個終結(jié)符對應(yīng)的具體值

最后客戶端調(diào)用

輸出結(jié)果

可能看到輸出結(jié)果的你還是一臉懵逼,到底解釋器模式做了些什么矾屯?

答:定義了一套簡單語法兼蕊,每個終結(jié)符都有一個對應(yīng)的值存起來了,
然后當(dāng)你輸了一串終結(jié)符件蚕,最后解釋能得出一個正確結(jié)果孙技。


本節(jié)示例代碼

https://github.com/coder-pig/DesignPatternsExample/tree/master/19.Interpreter%20Pattern


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市排作,隨后出現(xiàn)的幾起案子绪杏,更是在濱河造成了極大的恐慌,老刑警劉巖纽绍,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕾久,死亡現(xiàn)場離奇詭異,居然都是意外死亡拌夏,警方通過查閱死者的電腦和手機僧著,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來障簿,“玉大人盹愚,你說我怎么就攤上這事≌竟剩” “怎么了皆怕?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長西篓。 經(jīng)常有香客問我愈腾,道長,這世上最難降的妖魔是什么岂津? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任虱黄,我火速辦了婚禮,結(jié)果婚禮上吮成,老公的妹妹穿的比我還像新娘橱乱。我一直安慰自己辜梳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布泳叠。 她就那樣靜靜地躺著作瞄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪危纫。 梳的紋絲不亂的頭發(fā)上宗挥,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音叶摄,去河邊找鬼属韧。 笑死,一個胖子當(dāng)著我的面吹牛蛤吓,可吹牛的內(nèi)容都是我干的宵喂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼会傲,長吁一口氣:“原來是場噩夢啊……” “哼锅棕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淌山,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤裸燎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泼疑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體德绿,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年退渗,在試婚紗的時候發(fā)現(xiàn)自己被綠了移稳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡会油,死狀恐怖个粱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翻翩,我是刑警寧澤都许,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站嫂冻,受9級特大地震影響胶征,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜絮吵,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一弧烤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹬敲,春花似錦暇昂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瘪校,卻和暖如春澄暮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阱扬。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工泣懊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人麻惶。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓馍刮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窃蹋。 傳聞我的和親對象是個殘疾皇子卡啰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

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

  • 1 場景問題# 1.1 讀取配置文件## 考慮這樣一個實際的應(yīng)用,維護系統(tǒng)自定義的配置文件警没。 幾乎每個實際的應(yīng)用系...
    七寸知架構(gòu)閱讀 3,109評論 2 56
  • 引子 解釋器模式應(yīng)該是一個很少會用到的模式匈辱,也不太好理解,用例子的方式來講解吧杀迹。 定義 解釋器模式是類的行為模式亡脸。...
    silentleaf閱讀 3,587評論 1 4
  • 定義 解釋器模式是類的行為模式。給定一個語言之后树酪,解釋器模式可以定義出其文法的一種表示浅碾,并同時提供一個解釋器⌒峄兀客戶...
    步積閱讀 3,382評論 0 2
  • 簡介瀏覽器可以被認為是使用最廣泛的軟件绵载,本文將介紹瀏覽器的工 作原理埂陆,我們將看到,從你在地址欄輸入google.c...
    聽風(fēng)閣閱讀 3,286評論 0 7
  • 2015年娃豹,對于我來說焚虱,是一個從零開始的年份。過去的幾個月懂版,發(fā)生了很多事情鹃栽,大部分是不好的,但是現(xiàn)在看過來卻又是必...
    穎子閱讀 313評論 0 2