在特定領(lǐng)域中,某些變化雖然頻繁,但可以抽象為某種規(guī)則。這時(shí)候,結(jié)合特定領(lǐng)域,將問題抽象為語法規(guī)則,從而給出在該領(lǐng)域下的一般性解決方案。
典型模式
- Interpreter
Interpreter 解析器
動(dòng)機(jī)
- 在軟件構(gòu)建過程中,如果某一特定領(lǐng)域的問題比較復(fù)雜,類似的結(jié)構(gòu)不斷重復(fù)出現(xiàn),如果使用普通的編程方式來實(shí)現(xiàn)將面臨非常頻繁的變化。
- 在這種情況下,將特定領(lǐng)域的問題表達(dá)為某種語法規(guī)則下的句子,然后構(gòu)建一個(gè)解釋器來解釋這樣的句子,從而達(dá)到解決問題的目的。
模式定義
- 給定一個(gè)語言,定義它的文法的一種表示,并定義一種解釋器,這個(gè)解釋器使用該表示來解釋語言中的句子。
結(jié)構(gòu)
類圖
結(jié)構(gòu)中的角色
AbstractExpression:
- 聲明一個(gè)抽象的Interpret方法,抽象語法樹中所有的節(jié)點(diǎn)都必須實(shí)現(xiàn)該抽象方法。
TerminalExpression:
- 實(shí)現(xiàn)和語法中末端符號(hào)相關(guān)的Interpret方法。
- 在每個(gè)句子的末端符號(hào)中均需要一個(gè)TerminalExpression實(shí)例。
NonterminalExpression:
- 另外一個(gè)實(shí)現(xiàn)了AbstractExpression 接口的類,用來處理語法樹中非末端節(jié)點(diǎn)的語法。
- 它含有下一個(gè)AbstractExpression(s)的引用,調(diào)用它每個(gè)子節(jié)點(diǎn)的Interpret方法。
Context:
- Interpreter方法所需要的信息的容器,該信息對(duì)Interpreter而言全局可見。充當(dāng)幾個(gè)AbstractExpresssion 實(shí)例之間的通訊頻道。
要點(diǎn)總結(jié)
- Interpreter模式的應(yīng)用場合是interpreter模式應(yīng)用中的難點(diǎn),只有滿足“業(yè)務(wù)規(guī)則頻繁變化,且類似的模式不斷重復(fù)出現(xiàn),并且容易抽象為語法規(guī)則的問題”才適合使用Interpreter模式。
- 使用Interpreter模式來表示文法規(guī)則,從而可以使用面向?qū)ο蠹记蓙矸奖愕亍皵U(kuò)展”文法。
- Interpreter模式比較適合簡單的文法表示,對(duì)于復(fù)雜的文法表示,Interpreter模式會(huì)產(chǎn)生比較大的類層次結(jié)構(gòu),這時(shí)候就不應(yīng)該采用Interpreter模式了。對(duì)于復(fù)雜的問法表示需要求助于語法分析生成器這樣的標(biāo)準(zhǔn)工具。