Java描述设计模式(14):解释器模式
本文源碼:GitHub·點這里 || GitEE·點這里
一、解釋器模式
1、基礎概念
解釋器模式是對象的行為模式。給定一個語言之后,解釋器模式可以定義出其文法的一種表示,并同時提供一個解釋器。客戶端可以使用這個解釋器來解釋這個語言中的表達式。
2、模式圖解
3、核心角色
(1)、抽象表達式
Express:聲明具體表達式角色需要實現的抽象接口,該接口主要提供一個interpret()方法,稱做解釋操作。
(2)、終結符表達式
TerminalExpress:實現抽象表達式角色接口,主要是一個interpret()方法;每個終結符都有一個具體終結表達式與之相對應。比如解析c=a+b,a和b是終結符,解析a和b的解釋器就是終結符表達式。
(3)、非終結符表達式
NotTerminalExpress:每一條規則都需要一個具體的非終結符表達式用來銜接,一般是指運算符或者邏輯判斷,比如c=a+b,“+"就是非終結符,解析“+”的解釋器就是一個非終結符表達式。
(4)、環境容器
DataMap:一般是用來存放各個終結符所對應的具體值,比如c=a+b轉換為c=1+2。這些信息需要一個存放環境。
4、源代碼實現
- 類圖結構
- 源碼實現
二、Spring框架應用
1、源碼案例
import org.springframework.expression.Expression; import org.springframework.expression.spel.standard.SpelExpressionParser; public class SpringTest {public static void main(String[] args) {SpelExpressionParser parser = new SpelExpressionParser () ;Expression expression = parser.parseExpression("(1+3-2)*3") ;Integer result = (Integer)expression.getValue() ;System.out.println("result="+result);} }2、代碼分析
(1)Expression結構
表達式接口:具有不同的實現類。
interface Expression class CompositeStringExpression implements Expression class LiteralExpression implements Expression class SpelExpression implements Expression核心方法:
Object getValue() throws EvaluationException;(2)SpelExpressionParser結構
SpelExpressionParser extends TemplateAwareExpressionParser TemplateAwareExpressionParser implements ExpressionParser interface ExpressionParser(3)ExpressionParser接口
public interface ExpressionParser {Expression parseExpression(String var1) ;Expression parseExpression(String var1, ParserContext var2) ; }(4)Expression獲取
根據不同的條件獲取不同的Expression對象。這里產生類的依賴關系。
源碼位置:TemplateAwareExpressionParser
public Expression parseExpression(String expressionString, ParserContext context) throws ParseException {if (context == null) {context = NON_TEMPLATE_PARSER_CONTEXT;}return context.isTemplate() ? this.parseTemplate(expressionString, context) : this.doParseExpression(expressionString, context);}三、模式總結
- 場景
編譯器、運算符表達式、正則表達式、機器人等。
- 優點
當有一個表達式或者語言需要解釋執行,該場景下的內容可以考慮使用解釋器模式,使程序具有良好的擴展性。
- 缺點
解釋器模式會引起類膨脹,會導致程序執行和調試非常復雜,不容易理解。
四、源代碼地址
GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent總結
以上是生活随笔為你收集整理的Java描述设计模式(14):解释器模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 沦为一个教师——地震余震篇
- 下一篇: Python天天美味(22) - 拷贝对