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

標(biāo)簽: 設(shè)計(jì)模式初涉


描述性文字

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

定義

給定一個(gè)語(yǔ)言之后,解釋器模式可以定義出其文法的一種表示,并同時(shí)提供一個(gè)
解釋器,客戶(hù)端可以使用這個(gè)解釋器來(lái)解釋這個(gè)語(yǔ)言中的句子。

四個(gè)角色

  • AbstractExpression抽象表達(dá)式,聲明一個(gè)所有具體表達(dá)式都要實(shí)現(xiàn)的接口,
    接口中主要是一個(gè)interpret()方法,稱(chēng)為解釋操作,具體的解釋任務(wù)由他的各個(gè)實(shí)現(xiàn)
    類(lèi)來(lái)完成,而具體的解釋器又分別由 終結(jié)符解釋器非終結(jié)符解釋器 完成。

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

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

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

UML類(lèi)圖

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

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

  • 1.易于實(shí)現(xiàn)簡(jiǎn)易語(yǔ)法,一條語(yǔ)法規(guī)則用一個(gè)解釋器對(duì)象解釋執(zhí)行
  • 2.易于擴(kuò)展新的語(yǔ)法,只需創(chuàng)建相應(yīng)的解釋器對(duì)象,在創(chuàng)建抽象語(yǔ)法樹(shù)的時(shí)候使用即可。
  • 3.增加了新的解釋表達(dá)式的方式

缺點(diǎn)

  • 1.可使用場(chǎng)景較少
  • 2.對(duì)于復(fù)雜的文法比較難維護(hù)
  • 3.引起類(lèi)膨脹
  • 4.采用遞歸調(diào)用方法,效率,性能,維護(hù)問(wèn)題

使用場(chǎng)景

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

代碼示例

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

先定義抽象表達(dá)式

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

再接著定義常量與變量?jī)蓚€(gè)終結(jié)符表達(dá)式

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

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

輸出結(jié)果

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

答:定義了一套簡(jiǎn)單語(yǔ)法,每個(gè)終結(jié)符都有一個(gè)對(duì)應(yīng)的值存起來(lái)了,
然后當(dāng)你輸了一串終結(jié)符,最后解釋能得出一個(gè)正確結(jié)果。


本節(jié)示例代碼

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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1 場(chǎng)景問(wèn)題# 1.1 讀取配置文件## 考慮這樣一個(gè)實(shí)際的應(yīng)用,維護(hù)系統(tǒng)自定義的配置文件。 幾乎每個(gè)實(shí)際的應(yīng)用系...
    七寸知架構(gòu)閱讀 3,159評(píng)論 2 56
  • 引子 解釋器模式應(yīng)該是一個(gè)很少會(huì)用到的模式,也不太好理解,用例子的方式來(lái)講解吧。 定義 解釋器模式是類(lèi)的行為模式。...
    silentleaf閱讀 3,633評(píng)論 1 4
  • 定義 解釋器模式是類(lèi)的行為模式。給定一個(gè)語(yǔ)言之后,解釋器模式可以定義出其文法的一種表示,并同時(shí)提供一個(gè)解釋器。客戶(hù)...
    步積閱讀 3,421評(píng)論 0 2
  • 簡(jiǎn)介瀏覽器可以被認(rèn)為是使用最廣泛的軟件,本文將介紹瀏覽器的工 作原理,我們將看到,從你在地址欄輸入google.c...
    聽(tīng)風(fēng)閣閱讀 3,316評(píng)論 0 7
  • 2015年,對(duì)于我來(lái)說(shuō),是一個(gè)從零開(kāi)始的年份。過(guò)去的幾個(gè)月,發(fā)生了很多事情,大部分是不好的,但是現(xiàn)在看過(guò)來(lái)卻又是必...
    穎子閱讀 324評(píng)論 0 2