設計模式:解釋器模式(Interpreter)


給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
這里寫圖片描述

解釋器模式的角色:
1. 抽象表達式角色(AbstractExpression):聲明一個所有的具體表達式角色都需要實現的抽象接口。這個接口主要是一個interpret()方法,稱作解釋操作。
2. 終結符表達式角色(Terminal Expression):實現了抽象表達式角色所需求的接口,主要是一個interpret()方法;文法中的每一個終結符都有一個具體終結表達式與之相對應。比如有一個簡單的公式:R=R1+R2,在里面R1和R2就是終結符,對應的解析R1和R2的解釋器就是終結符表達式。
3. 非終結符表達式角色(Nonterminal Expression):文法中的每一條規則都需要一個具體的非終結符表達式,非終結符表達式一般是文法中的運算符或者其他關鍵字。比如R=R1+R2中的“+”就是非終結符,解析“+”的解釋器就是一個非終結符表達式。
4. 環境角色(Context):這個角色的任務一般是用來存放文法中各個終結符所對應的具體值。比如R=R1+R2,我們給R1賦值100,給R2賦值200。這些信息需要存放到環境角色中,很多情況下我們使用Map來充當環境角色就足夠了。

這個模式確實用的不多,關於案例介紹可以翻看一下資料3.

優缺點
優點:

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

缺點:

  1. 解釋器模式會引起類膨脹,每個語法都要產生一個非終結符表達式,語法規則比較復雜時,可能產生a大量的類文件,難以維護。
  2. 解釋器模式采用遞歸調用方法,它導致調試非常復雜。
  3. 解釋器由於使用了大量的循環和遞歸,所以當用於解析復雜、冗長的語法時,效率是難以忍受的。

TIPS: 盡量不要在重要模塊中使用解釋器模式,因為難以維護。在項目中,可以使用shell, python等腳本語言來代替解釋器模式。

JDK中的解釋器模式:
java.util.Pattern
java.text.Normalizer
java.text.Format


參考資料
1. 《23種設計模式
2. 《細數JDK里的設計模式
3. 《《JAVA與模式》之解釋器模式


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com