<wbr id="jl7f7"></wbr>

        <i id="jl7f7"></i>
          <acronym id="jl7f7"></acronym>

          <s id="jl7f7"></s>

          <ins id="jl7f7"></ins><button id="jl7f7"><strong id="jl7f7"></strong></button>
          鍍金池/ 教程/ Java/ 解釋器模式
          訪(fǎng)問(wèn)者模式
          訪(fǎng)問(wèn)者模式討論篇:java的動(dòng)態(tài)綁定與雙分派
          責任連模式
          迭代器模式
          策略模式
          命令模式
          單例模式
          建造者模式
          解釋器模式
          工廠(chǎng)方法模式
          備忘錄模式
          原型模式
          單例模式討論篇:?jiǎn)卫J脚c垃圾回收
          觀(guān)察者模式
          模版方法模式
          創(chuàng )建類(lèi)模式總結篇
          抽象工廠(chǎng)模式
          中介者模式

          解釋器模式

          定義:給定一種語(yǔ)言,定義他的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來(lái)解釋語(yǔ)言中句子。

          類(lèi)型:行為類(lèi)模式

          類(lèi)圖:

          http://wiki.jikexueyuan.com/project/java-design-pattern/images/interpreter-pattern-1.jpg" alt="interpreter-pattern" />

          解釋器模式是一個(gè)比較少用的模式,本人之前也沒(méi)有用過(guò)這個(gè)模式。下面我們就來(lái)一起看一下解釋器模式。

          解釋器模式的結構

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

          代碼實(shí)現

              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 stack = new Stack();
                      for(int i=0;i
                       //進(jìn)行語(yǔ)法判斷,遞歸調用  
                  }  
                  Expression exp = stack.pop();  
                  exp.interpreter(ctx);  
              }  
          }  

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

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

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

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

          解釋器模式的適用場(chǎng)景

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

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

          注意事項

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

          上一篇:命令模式下一篇:觀(guān)察者模式
          日韩性做爰免费a片aa片,天天躁恨恨躁夜躁2020,精品久久综合1区2区3区激情,精产国品一二三产品麻豆

          <wbr id="jl7f7"></wbr>

                <i id="jl7f7"></i>
                  <acronym id="jl7f7"></acronym>

                  <s id="jl7f7"></s>

                  <ins id="jl7f7"></ins><button id="jl7f7"><strong id="jl7f7"></strong></button>