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

23種設計模式(15)java解釋器模式

 更新時間:2021年11月07日 12:21:06   作者:阿木俠  
這篇文章主要為大家詳細介紹了23種設計模式之java解釋器模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下

23種設計模式第十五篇:java解釋器模式

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

類型:行為類模式

類圖:

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

解釋器模式的結構

抽象解釋器:聲明一個所有具體表達式都要實現(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ā)中使用的很少,因為他會引起效率、性能以及維護等問題。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Nacos源碼閱讀方法

    Nacos源碼閱讀方法

    這篇文章將會帶大家閱讀Nacos源碼以及教大家閱讀源碼的技巧,感興趣的朋友跟隨小編一起看看Nacos源碼閱讀方法
    2022-03-03
  • Spring IOC相關注解運用(上篇)

    Spring IOC相關注解運用(上篇)

    這篇文章主要介紹了Spring?IOC相關注解的運用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • Java Object定義三個點實現(xiàn)代碼

    Java Object定義三個點實現(xiàn)代碼

    這篇文章主要介紹了Java Object定義三個點實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • MyBatis+MyBatisPlus中遇到的一些坑及解決

    MyBatis+MyBatisPlus中遇到的一些坑及解決

    這篇文章主要介紹了MyBatis+MyBatisPlus中遇到的一些坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Spring手寫簡化版MVC流程詳解

    Spring手寫簡化版MVC流程詳解

    Spring MVC是Spring Framework的一部分,是基于Java實現(xiàn)MVC的輕量級Web框架。本文將通過簡單示例帶大家掌握SpringMVC簡化版手寫方法,感興趣的可以了解一下
    2022-11-11
  • java使用lambda表達式多條件排序方式

    java使用lambda表達式多條件排序方式

    這篇文章主要介紹了java使用lambda表達式多條件排序方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java1.8中StringJoiner的使用及源碼詳析

    Java1.8中StringJoiner的使用及源碼詳析

    在看String類時,看到有使用StringJoiner類,所以順便看了下StringJoiner類,下面這篇文章主要給大家介紹了關于Java 1.8中StringJoiner的使用及源碼分析的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-08-08
  • Spring+SpringMVC+MyBatis整合詳細教程(SSM)

    Spring+SpringMVC+MyBatis整合詳細教程(SSM)

    Spring是一個開源框架,Spring是于2003 年興起的一個輕量級的Java 開發(fā)框架。這篇文章主要介紹了Spring+SpringMVC+MyBatis整合詳細教程(SSM),需要的朋友可以參考下
    2017-10-10
  • java實現(xiàn)文件導入導出

    java實現(xiàn)文件導入導出

    這篇文章主要介紹了java實現(xiàn)文件導入導出的方法和具體示例代碼,非常的簡單實用,有需要的小伙伴可以參考下
    2016-04-04
  • Java 文件上傳與路徑處理之Paths.get()、resolve()、transferTo()的用法詳解

    Java 文件上傳與路徑處理之Paths.get()、resolve()、transferTo()的用法詳解

    本文詳細解析了如何使用Java的Paths.get()、resolve()和Spring的transferTo()方法處理文件上傳功能,并給出了完整的代碼示例,感興趣的朋友跟隨小編一起看看吧
    2024-10-10

最新評論

阿图什市| 双峰县| 德惠市| 共和县| 措勤县| 柳河县| 新乐市| 科技| 桃园市| 礼泉县| 资兴市| 万年县| 承德县| 康乐县| 郓城县| 乌审旗| 蒲江县| 大洼县| 蓬安县| 中阳县| 田阳县| 循化| 蓬莱市| 女性| 都昌县| 平邑县| 顺义区| 东阳市| 黎平县| 卢龙县| 凤阳县| 肇庆市| 深州市| 宿州市| 邛崃市| 盐池县| 开化县| 保康县| 綦江县| 尉犁县| 大余县|