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

Java設計模式之解釋器模式_動力節(jié)點Java學院整理

 更新時間:2017年08月16日 10:53:39   作者:zhengzhb  
解釋器模式是一個比較少用的模式,本人之前也沒有用過這個模式。下面我們就來一起看一下解釋器模式

定義:給定一種語言,定義他的文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中句子。

類型:行為類模式

類圖:

        解釋器模式是一個比較少用的模式,本人之前也沒有用過這個模式。下面我們就來一起看一下解釋器模式。 

解釋器模式的結構

  • 抽象解釋器:聲明一個所有具體表達式都要實現(xiàn)的抽象接口(或者抽象類),接口中主要是一個interpret()方法,稱為解釋操作。具體解釋任務由它的各個實現(xiàn)類來完成,具體的解釋器分別由終結符解釋器TerminalExpression和非終結符解釋器NonterminalExpression完成。
  • 終結符表達式:實現(xiàn)與文法中的元素相關聯(lián)的解釋操作,通常一個解釋器模式中只有一個終結符表達式,但有多個實例,對應不同的終結符。終結符一半是文法中的運算單元,比如有一個簡單的公式R=R1+R2,在里面R1和R2就是終結符,對應的解析R1和R2的解釋器就是終結符表達式。                                
  • 非終結符表達式:文法中的每條規(guī)則對應于一個非終結符表達式,非終結符表達式一般是文法中的運算符或者其他關鍵字,比如公式R=R1+R2中,+就是非終結符,解析+的解釋器就是一個非終結符表達式。非終結符表達式根據(jù)邏輯的復雜程度而增加,原則上每個文法規(guī)則都對應一個非終結符表達式。
  • 環(huán)境角色:這個角色的任務一般是用來存放文法中各個終結符所對應的具體值,比如R=R1+R2,我們給R1賦值100,給R2賦值200。這些信息需要存放到環(huán)境角色中,很多情況下我們使用Map來充當環(huán)境角色就足夠了。

代碼實現(xiàn)

class Context {} 
abstract class Expression { 
  public abstract Object interpreter(Context ctx); 
} 
class TerminalExpression extends Expression { 
  public Object interpreter(Context ctx){ 
    return null; 
  } 
} 
class NonterminalExpression extends Expression { 
  public NonterminalExpression(Expression...expressions){ 
     
  } 
  public Object interpreter(Context ctx){ 
    return null; 
  } 
} 
public class Client { 
  public static void main(String[] args){ 
    String expression = ""; 
    char[] charArray = expression.toCharArray(); 
    Context ctx = new Context(); 
    Stack<Expression> stack = new Stack<Expression>(); 
    for(int i=0;i<charArray.length;i++){ 
      //進行語法判斷,遞歸調用 
    } 
    Expression exp = stack.pop(); 
    exp.interpreter(ctx); 
  } 
} 

        文法遞歸的代碼部分需要根據(jù)具體的情況來實現(xiàn),因此在代碼中沒有體現(xiàn)。抽象表達式是生成語法集合的關鍵,每個非終結符表達式解釋一個最小的語法單元,然后通過遞歸的方式將這些語法單元組合成完整的文法,這就是解釋器模式。 

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

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

        但是,解釋器模式會引起類的膨脹,每個語法都需要產生一個非終結符表達式,語法規(guī)則比較復雜時,就可能產生大量的類文件,為維護帶來非常多的麻煩。同時,由于采用遞歸調用方法,每個非終結符表達式只關心與自己相關的表達式,每個表達式需要知道最終的結果,必須通過遞歸方式,無論是面向對象的語言還是面向過程的語言,遞歸都是一個不推薦的方式。由于使用了大量的循環(huán)和遞歸,效率是一個不容忽視的問題。特別是用于解釋一個解析復雜、冗長的語法時,效率是難以忍受的。 

解釋器模式的適用場景

        在以下情況下可以使用解釋器模式:

  • 有一個簡單的語法規(guī)則,比如一個sql語句,如果我們需要根據(jù)sql語句進行rm轉換,就可以使用解釋器模式來對語句進行解釋。
  • 一些重復發(fā)生的問題,比如加減乘除四則運算,但是公式每次都不同,有時是a+b-c*d,有時是a*b+c-d,等等等等個,公式千變萬化,但是都是由加減乘除四個非終結符來連接的,這時我們就可以使用解釋器模式。

注意事項

       解釋器模式真的是一個比較少用的模式,因為對它的維護實在是太麻煩了,想象一下,一坨一坨的非終結符解釋器,假如不是事先對文法的規(guī)則了如指掌,或者是文法特別簡單,則很難讀懂它的邏輯。解釋器模式在實際的系統(tǒng)開發(fā)中使用的很少,因為他會引起效率、性能以及維護等問題。

總結

以上所述是小編給大家介紹的Java設計模式之解釋器模式_動力節(jié)點Java學院整理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • Java中獲取當前路徑的幾種方法總結

    Java中獲取當前路徑的幾種方法總結

    這篇文章主要介紹了Java中獲取當前路徑的幾種方法總結的相關資料,需要的朋友可以參考下
    2017-02-02
  • Spring容器中已經存在的Bean替換示例

    Spring容器中已經存在的Bean替換示例

    這篇文章主要為大家介紹了Spring容器中已經存在的Bean替換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • spring schedule實現(xiàn)動態(tài)配置執(zhí)行時間

    spring schedule實現(xiàn)動態(tài)配置執(zhí)行時間

    這篇文章主要介紹了spring schedule實現(xiàn)動態(tài)配置執(zhí)行時間,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java Web中解決路徑(絕對路徑與相對路徑)問題

    Java Web中解決路徑(絕對路徑與相對路徑)問題

    這篇文章主要介紹了Java Web中解決路徑問題的相關資料,java 文件路徑有絕對路徑與相對路徑,這里提供了幾種方法解決所有路徑問題,需要的朋友可以參考下
    2017-01-01
  • Java?Web實現(xiàn)簡易圖書管理系統(tǒng)

    Java?Web實現(xiàn)簡易圖書管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java?Web實現(xiàn)簡易圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Java servlet執(zhí)行流程代碼實例

    Java servlet執(zhí)行流程代碼實例

    這篇文章主要介紹了Java servlet執(zhí)行流程代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • 分析JAVA中幾種常用的RPC框架

    分析JAVA中幾種常用的RPC框架

    這篇文章主要介紹了JAVA中幾種常用的RPC框架的相關知識點,對此有興趣的朋友參考學習下吧。
    2018-03-03
  • Java內存模型知識詳解

    Java內存模型知識詳解

    這篇文章主要介紹了Java內存模型知識詳解,文中通過對內存訪問時的交互關系圖解介紹的十分詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java如何在List或Map遍歷過程中刪除元素

    Java如何在List或Map遍歷過程中刪除元素

    相信大家在日常的開發(fā)過程中,經常需要對List或Map里面的符合某種業(yè)務的數(shù)據(jù)進行刪除,但是如果不了解里面的機制就容易掉入“陷阱”導致遺漏或者程序異常。下面這篇文章將會給大家詳細介紹Java如何在List和Map遍歷過程中刪除元素,有需要的朋友們可以參考借鑒。
    2016-12-12
  • Java中UUID生成原理及優(yōu)缺點

    Java中UUID生成原理及優(yōu)缺點

    本文將詳細講解UUID的生成原理、特性、實用場景以及優(yōu)缺點,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06

最新評論

三穗县| 小金县| 安吉县| 佛山市| 大足县| 洪洞县| 新郑市| 梨树县| 府谷县| 屯昌县| 寿宁县| 轮台县| 大竹县| 左云县| 连云港市| 广德县| 新兴县| 普兰店市| 收藏| 偃师市| 古蔺县| 神木县| 德令哈市| 遂溪县| 侯马市| 沧州市| 宁远县| 敦煌市| 东宁县| 启东市| 泰来县| 安国市| 卓尼县| 正定县| 五家渠市| 本溪| 民勤县| 铜鼓县| 聊城市| 洛浦县| 乌恰县|