設計模式之解釋器模式

解釋器模式(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

相關文章
相關標籤/搜索