解釋器模式(Interpreter),其含義是給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。若是一個特定類型的問題發生的頻率足夠高,那麼可能就值得將該問題各個實例表述爲一個簡單語言中的句子。這樣構造一個解釋器,經過解釋這些句子來解決該問題了。
解釋器模式使用類來表示每一條文法規則。
其適用性:java
當有一個語言須要解釋執行,而且你可將該語言中的句子表示爲一個抽象語法樹時,可以使用解釋器模式,一下狀況時效果更好:正則表達式
該文法簡單,對於複雜的文法,文法的類層次變得龐大而沒法管理。此時語法分析程序生成器這樣的工具是更好的選擇。它們無需構建抽象語法樹便可解釋表達式,這樣能夠節省空間並且還可能節省時間,工具
效率不是一個關鍵問題,最高效的解釋器一般不是經過直接解釋語法分析樹實現的,而是首先將它們轉換成另外一種形式。例如,正則表達式一般被轉換成狀態機。但即便在這種狀況下,轉換器仍可用解釋器模式實現,該模式還是有用的。測試
結構圖以下:this
Client來構建一個句子,包含NonterminalExpression和TerminalExpression的實例的一個抽象語法樹,而後初始化上下文並調用解釋操做。非終結符表達式節點定義相應子表達式的解釋操做,終結符表達式有各自的解釋操做。若是文法較多複雜的話,會比較難維護。本文實現的解釋器模式未定義語法樹,僅僅是一個打印表述。spa
Context.java設計
package
org.designpattern.behavioral.interpreter;
import java.util.ArrayList;
import java.util.List;
public
class Context {
private List list;
public
void add(AbstractExpression exp){
list.add(exp);
}
public List<AbstractExpression> getList(){
return list;
}
public Context(){
this.list =
new ArrayList<AbstractExpression>();
}
}
下面是客戶端測試類:code
package
org.designpattern.behavioral.interpreter;
public
class Main {
public
static
void main(String[] args) {
Context ctx =
new Context();
ctx.add(
new TerminalExpression());
ctx.add(
new NonterminalExpression());
ctx.add(
new TerminalExpression());
for(AbstractExpression exp : ctx.getList()){
exp.interpret(ctx);
}
}
} 對象
解釋器模式主要在於設計一個好的文法樹,並用面向對象的形式設計出來,在類與類之間的層次調用上,實現相應的解釋操做。該模式在實際的系統開發使用較少,在分析文法樹,解釋器要遞歸訪問它,效率也不怎麼好,編譯整個工程源碼也比較耗時。blog