欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

類型:行為類模式

類圖:

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

解釋器模式的結(jié)構(gòu)

  • 抽象解釋器:聲明一個所有具體表達式都要實現(xiàn)的抽象接口(或者抽象類),接口中主要是一個interpret()方法,稱為解釋操作。具體解釋任務(wù)由它的各個實現(xiàn)類來完成,具體的解釋器分別由終結(jié)符解釋器TerminalExpression和非終結(jié)符解釋器NonterminalExpression完成。
  • 終結(jié)符表達式:實現(xiàn)與文法中的元素相關(guān)聯(lián)的解釋操作,通常一個解釋器模式中只有一個終結(jié)符表達式,但有多個實例,對應(yīng)不同的終結(jié)符。終結(jié)符一半是文法中的運算單元,比如有一個簡單的公式R=R1+R2,在里面R1和R2就是終結(jié)符,對應(yīng)的解析R1和R2的解釋器就是終結(jié)符表達式。                                
  • 非終結(jié)符表達式:文法中的每條規(guī)則對應(yīng)于一個非終結(jié)符表達式,非終結(jié)符表達式一般是文法中的運算符或者其他關(guān)鍵字,比如公式R=R1+R2中,+就是非終結(jié)符,解析+的解釋器就是一個非終結(jié)符表達式。非終結(jié)符表達式根據(jù)邏輯的復(fù)雜程度而增加,原則上每個文法規(guī)則都對應(yīng)一個非終結(jié)符表達式。
  • 環(huán)境角色:這個角色的任務(wù)一般是用來存放文法中各個終結(jié)符所對應(yīng)的具體值,比如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++){ 
      //進行語法判斷,遞歸調(diào)用 
    } 
    Expression exp = stack.pop(); 
    exp.interpreter(ctx); 
  } 
} 

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

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

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

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

解釋器模式的適用場景

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

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

注意事項

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

總結(jié)

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

相關(guān)文章

  • Java編程中的一些常見問題匯總

    Java編程中的一些常見問題匯總

    這篇文章主要介紹了Java編程中的一些常見問題匯總,本文總結(jié)的都是一些Java代碼中比較典型的錯誤,需要的朋友可以參考下
    2014-09-09
  • Java SpringMVC 集成靜態(tài)資源的方式你了解嗎

    Java SpringMVC 集成靜態(tài)資源的方式你了解嗎

    本篇文章主要介紹了SpringMVC集成靜態(tài)資源的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-10-10
  • 使用MyBatis攔截器實現(xiàn)sql查詢權(quán)限動態(tài)修改代碼實例

    使用MyBatis攔截器實現(xiàn)sql查詢權(quán)限動態(tài)修改代碼實例

    這篇文章主要介紹了使用MyBatis攔截器實現(xiàn)sql查詢權(quán)限動態(tài)修改代碼實例,為了不耦合,現(xiàn)在的方案是在需要鑒權(quán)的Mybatis?Mapper方法上增加一個注解,在運行過程中判斷該注解存在即對sql進行修改,需要的朋友可以參考下
    2023-08-08
  • JAVA實現(xiàn)鏈表面試題

    JAVA實現(xiàn)鏈表面試題

    這篇文章主要為大家詳細介紹了JAVA相關(guān)實現(xiàn)鏈表的面試題,代碼實現(xiàn)非常詳細,每一個方法講解也很到位,特別適合參加Java面試的朋友閱讀
    2015-09-09
  • Java中的main函數(shù)的詳細介紹

    Java中的main函數(shù)的詳細介紹

    這篇文章主要介紹了Java中的main函數(shù)的詳細介紹的相關(guān)資料,main()函數(shù)在java程序中必出現(xiàn)的函數(shù),這里就講解下使用方法,需要的朋友可以參考下
    2017-09-09
  • java如何發(fā)送get請求獲取數(shù)據(jù)(附代碼)

    java如何發(fā)送get請求獲取數(shù)據(jù)(附代碼)

    這篇文章主要給大家介紹了關(guān)于java如何發(fā)送get請求獲取數(shù)據(jù)的相關(guān)資料,Java中的GET請求方法是HTTP協(xié)議中的一種請求方式,用于向服務(wù)器請求獲取資源,需要的朋友可以參考下
    2023-10-10
  • java正則表達式對特殊字符的轉(zhuǎn)義以及異?,F(xiàn)象

    java正則表達式對特殊字符的轉(zhuǎn)義以及異?,F(xiàn)象

    這篇文章主要給大家介紹了關(guān)于java正則表達式對特殊字符的轉(zhuǎn)義以及異常現(xiàn)象的相關(guān)資料,在Java中使用正則表達式匹配特殊字符也需要使用轉(zhuǎn)義字符"\",需要的朋友可以參考下
    2023-06-06
  • ava實現(xiàn)一致性Hash算法

    ava實現(xiàn)一致性Hash算法

    本文主要詳細介紹了Java如何實現(xiàn)一致性Hash算法,其實現(xiàn)原理將key映射到?2^32?-?1?的空間中,將這個數(shù)字的首尾相連,形成一個環(huán)。想了解更多的同學(xué),可以參考本文
    2023-03-03
  • SpringBoot集成vue的開發(fā)解決方案

    SpringBoot集成vue的開發(fā)解決方案

    這篇文章主要介紹了SpringBoot集成vue的開發(fā)解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • JAVA生產(chǎn)者消費者(線程同步)代碼學(xué)習(xí)示例

    JAVA生產(chǎn)者消費者(線程同步)代碼學(xué)習(xí)示例

    這篇文章主要介紹了JAVA線程同步的代碼學(xué)習(xí)示例,大家參考使用吧
    2013-11-11

最新評論