標(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