最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計模式編程之解釋器模式的簡單講解

 更新時間:2016年04月25日 14:52:04   作者:匆忙擁擠repeat  
這篇文章主要介紹了Java設(shè)計模式編程之解釋器模式的講解,解釋器設(shè)計模式要注意其引發(fā)的性能問題,需要的朋友可以參考下

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

2016425145227022.jpg (619×363)

1.解釋器模式的優(yōu)點

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

2.解釋器模式的缺點

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

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

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

4.簡單例子

/** 
 * 聲明一個抽象的解釋操作 
 */ 
public interface Interpreter { 
   
  public void interpret(Context context); //實際中,可以有個返回的類型,定義解釋出的數(shù)據(jù)對象 
} 

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數(shù)據(jù)"); 
    new XmlSaxInterpreter().interpret(context); 
    new XmlDomInterpreter().interpret(context); 
  } 
} 

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

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


 

相關(guān)文章

  • Java數(shù)據(jù)結(jié)構(gòu)之Map與Set專篇講解

    Java數(shù)據(jù)結(jié)構(gòu)之Map與Set專篇講解

    這篇文章通過實例面試題目來講解Java中Map和Set之間的關(guān)系,具有很好的參考價值,Map與Set在面試中經(jīng)常會遇到。一起跟隨小編過來看看吧
    2022-01-01
  • Lucene詞向量索引文件構(gòu)建源碼解析

    Lucene詞向量索引文件構(gòu)建源碼解析

    這篇文章主要為大家介紹了Lucene詞向量索引文件構(gòu)建源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • java實現(xiàn)菜單樹的示例代碼

    java實現(xiàn)菜單樹的示例代碼

    這篇文章主要為大家詳細介紹了java實現(xiàn)菜單樹的相關(guān)知識,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習一下
    2023-12-12
  • java實現(xiàn)留言板功能實例

    java實現(xiàn)留言板功能實例

    這篇文章主要為大家詳細介紹了JSP+JavaBean的留言板技術(shù) ,JavaWeb登陸功能實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java中double和float類型的區(qū)別與使用方法

    Java中double和float類型的區(qū)別與使用方法

    float和double都是用來表示浮點數(shù)的數(shù)據(jù)類型,但是它們之間有一些區(qū)別,這篇文章主要給大家介紹了關(guān)于Java中double和float類型的區(qū)別與使用方法的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • 純注解版spring與mybatis的整合過程

    純注解版spring與mybatis的整合過程

    這篇文章主要介紹了純注解版spring與mybatis的整合過程,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Spring Boot優(yōu)雅使用RocketMQ的方法實例

    Spring Boot優(yōu)雅使用RocketMQ的方法實例

    這篇文章主要給大家介紹了關(guān)于Spring Boot優(yōu)雅使用RocketMQ的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習或者使用Spring Boot具有一定的參考學(xué)習價值,需要的朋友們下面來一起學(xué)習學(xué)習吧
    2019-12-12
  • 淺談Java文件執(zhí)行順序、main程序入口的理解

    淺談Java文件執(zhí)行順序、main程序入口的理解

    這篇文章主要介紹了Java文件執(zhí)行順序、main程序入口的理解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-03-03
  • Mybatis配置之<environments>配置元素詳解

    Mybatis配置之<environments>配置元素詳解

    這篇文章主要介紹了Mybatis配置之<environments>配置元素,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java中超詳細this與super的概念和用法

    Java中超詳細this與super的概念和用法

    這篇文章主要介紹了Java中超詳細this與super的概念和用法,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02

最新評論

沙河市| 扎鲁特旗| 湛江市| 富蕴县| 中超| 碌曲县| 宁阳县| 双江| 宜宾县| 湟中县| 彭山县| 孟村| 杨浦区| 万年县| 曲阜市| 融水| 新巴尔虎右旗| 信宜市| 公主岭市| 星子县| 历史| 陇南市| 元谋县| 泸州市| 武宣县| 宁德市| 乌兰浩特市| 辉县市| 沭阳县| 临夏市| 玉山县| 英德市| 庆云县| 乌拉特后旗| 渑池县| 礼泉县| 漳浦县| 都匀市| 巴林左旗| 清新县| 兴海县|