標簽: 設(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類圖
![](http://static.zybuluo.com/coder-pig/hlv67hov2kyzqkmb2kopl1nu/image_1bbkrlahurjp1uneiom133s182t9.png)
優(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í)行的語言中的句子表示為一個抽象語法樹
代碼示例
定義一個能夠解釋加減法的解釋器作為示例
先定義抽象表達式
![](http://static.zybuluo.com/coder-pig/6q0420yqf8kj6k836niiov8v/image_1bbksku8r1snuk3nnvsf3bkj2m.png)
接著定義加減法兩個非終結(jié)符表達式
![](http://static.zybuluo.com/coder-pig/xgoci9bb2hx4y8sj1bjh1fhs/image_1bbksmgmh10pbppn11to1fbl12ss13.png)
![](http://static.zybuluo.com/coder-pig/2frhzexyc28dh8ybuq82rji1/image_1bbksn2d01b1c60c1j45131h1mqh1g.png)
再接著定義常量與變量兩個終結(jié)符表達式
![](http://static.zybuluo.com/coder-pig/j1jvi65g2kihbajjo8r6123t/image_1bbkso9r9dio1j7hinf1h8kepl1t.png)
![](http://static.zybuluo.com/coder-pig/aslq0moofv1riuefk7zx1kvg/image_1bbksov9o2ep1dr21o9udc516ou2a.png)
然后定義上下文環(huán)境晴叨,用Map存放各個終結(jié)符對應(yīng)的具體值
![](http://static.zybuluo.com/coder-pig/xqzohatwhacoekzsjbkxird2/image_1bbksqpik1lfhev51mtg15gp1lsr2n.png)
最后客戶端調(diào)用
![](http://static.zybuluo.com/coder-pig/9ey7qtb98kmtp3vnrhb6l9m6/image_1bbkssd5bpoj151q1rtk19kco4734.png)
輸出結(jié)果
![](http://static.zybuluo.com/coder-pig/vknr60lqs6ufpdb5fohvazws/image_1bbksspqu1msk848pmp141gtqp3h.png)
可能看到輸出結(jié)果的你還是一臉懵逼,到底解釋器模式做了些什么矾屯?
答:定義了一套簡單語法兼蕊,每個終結(jié)符都有一個對應(yīng)的值存起來了,
然后當(dāng)你輸了一串終結(jié)符件蚕,最后解釋能得出一個正確結(jié)果孙技。
本節(jié)示例代碼:
https://github.com/coder-pig/DesignPatternsExample/tree/master/19.Interpreter%20Pattern