国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java設計模式編程之解釋器模式的簡單講解

2019-11-26 14:25:27
字體:
來源:轉載
供稿:網友

0.解釋器(Interpreter)模式定義 :
給定一門語言,定義它的文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中句子。 屬于行為型模式。
解釋器模式在實際的系統開發中使用的非常少,因為它會引起效率、性能以及維護等問題。
解釋器模式的通用類圖如圖所示。

2016425145227022.jpg (619×363)

1.解釋器模式的優點

解釋器是一個簡單語法分析工具,它最顯著的優點就是擴展性,修改語法規則只要修改相應的非終結符表達式就可以了,若擴展語法,則只要增加非終結符類就可以了。

2.解釋器模式的缺點

解釋器模式會引起類膨脹:每個語法都要產生一個非終結符表達式,語法規則比較復雜時,就可能產生大量的類文件,為維護帶來了非常多的麻煩。
解釋器模式采用遞歸調用方法:每個非終結符表達式只關心與自己有關的表達式,每個表達式需要知道最終的結果,必須一層一層地剝繭,無論是面向過程的語言還是面向對象的語言,遞歸都是在必要條件下使用的,它導致調試非常復雜。想想看,如果要排查一個語法錯誤,我們是不是要一個一個斷點的調試下去,直到最小的語法單元。
效率問題:解釋器模式由于使用了大量的循環和遞歸,效率是個不容忽視的問題,特別是用于解析復雜、冗長的語法時,效率是難以忍受的。

3.解釋器模式的使用場景

重復發生的問題可以使用解釋器模式:例如,多個應用服務器,每天產生大量的日志,需要對日志文件進行分析處理,由于各個服務器的日志格式不同,但是數據要素是相同的,按照解釋器的說法就是終結符表達式都是相同的,但是非終結符表達式就需要制定了。在這種情況下,可以通過程序來一勞永逸地解決該問題。
一個簡單語法需要解釋的場景:為什么是簡單?看看非終結表達式,文法規則越多,復雜度越高,而且類間還要進行遞歸調用(看看我們例子中的堆棧),不是一般地復雜。想想看,多個類之間的調用你需要什么樣的耐心和信心去排查問題。因此,解釋器模式一般用來解析比較標準的字符集,例如SQL語法分析,不過該部分逐漸被專用工具所取代。在某些特用的商業環境下也會采用解釋器模式,我們剛剛的例子就是一個商業環境,而且現在模型運算的例子非常多,目前很多商業機構已經能夠提供出大量的數據進行分析。

4.簡單例子

/**  * 聲明一個抽象的解釋操作  */ public interface Interpreter {      public void interpret(Context context); //實際中,可以有個返回的類型,定義解釋出的數據對象 } public class XmlSaxInterpreter implements Interpreter {    @Override   public void interpret(Context context) {     System.out.println("xml sax Interpreter:" + context.getData());   }  } public class XmlDomInterpreter implements Interpreter {    @Override   public void interpret(Context context) {     System.out.println("xml dom Interpreter:" + context.getData());   }  } /**  * 包含解釋器之外的一些信息  */ public class Context {   private String data;      public String getData() {     return data;   }      public void setData(String data) {     this.data = data;   } } public class Test {   public static void main(String[] args) {     Context context = new Context();     context.setData("一段xml數據");     new XmlSaxInterpreter().interpret(context);     new XmlDomInterpreter().interpret(context);   } } 

5.解釋器模式的注意事項

盡量不要在重要的模塊中使用解釋器模式,否則維護會是一個很大的問題。在項目中可以使用shell、JRuby、Groovy等腳本語言來代替解釋器模式,彌補Java編譯型語言的不足。我們在一個銀行的分析型項目中就采用JRuby進行運算處理,避免使用解釋器模式的四則運算,效率和性能各方面表現良好。


 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 内乡县| 耒阳市| 车致| 阿勒泰市| 社会| 宣恩县| 南靖县| 西宁市| 商水县| 东乡族自治县| 新余市| 肥西县| 岳普湖县| 扎赉特旗| 淮阳县| 噶尔县| 衡东县| 浪卡子县| 福建省| 台东县| 蒲江县| 土默特左旗| 固阳县| 当阳市| 甘谷县| 兴安盟| 原阳县| 美姑县| 玛多县| 清流县| 逊克县| 景谷| 神木县| 孟连| 高州市| 西乌珠穆沁旗| 昂仁县| 镇沅| 报价| 米易县| 成武县|