解释器模式在JDK和Spring源码中的应用
本节我们介绍解释器模式在 JDK 和 Spring 源码中的应用。
下面先看 JDK 源码中 Pattern 类对正则表达式的编译和解析,源码如下。
ExpressionParser 不知道大家有没有用过,这里面也可以进行加减乘除运算。这里我们不深入讲解源码,通过《解释器模式》一节编写的案例大致就能够清楚其原理。如下是一个简单的应用示例:
运行结果如下。
解释器模式一般在业务开发中用的相对较少,常用的表达式都有人解析好了,直接用就可以了,除非我们从事底层开发需要自己去定义较为复杂的表达式。
解释器模式在JDK源码中的应用
正则表达式是解释器模式一个很好的体现,因为正则表达式本身就是一个语法的封装。下面先看 JDK 源码中 Pattern 类对正则表达式的编译和解析,源码如下。
- package java.util.regex;
- public final class Pattern
- implements java.io.Serializable
- {
- ...
- private Pattern(String p, int f) {
- pattern = p;
- flags = f;
- // to use UNICODE_CASE if UNICODE_CHARACTER_CLASS present
- if ((flags & UNICODE_CHARACTER_CLASS) != 0)
- flags |= UNICODE_CASE;
- // Reset group index count
- capturingGroupCount = 1;
- localCount = 0;
- if (pattern.length() > 0) {
- try {
- compile();
- } catch (StackOverflowError soe) {
- throw error("Stack overflow during pattern compilation");
- }
- } else {
- root = new Start(lastAccept);
- matchRoot = lastAccept;
- }
- }
- ...
- public static Pattern compile(String regex) {
- return new Pattern(regex, 0);
- }
- public static Pattern compile(String regex, int flags) {
- return new Pattern(regex, flags);
- }
- ...
- }
解释器模式在Spring源码中的应用
在 Spring 中,ExpressionParser 接口内部采用的也是解释器模式,它封装了字符串表达式的语法,源码如下。
- package org.springframework.expression;
- public interface ExpressionParser {
- Expression parseExpression(String expressionString) throws ParseException;
- Expression parseExpression(String expressionString, ParserContext context) throws ParseException;
- }
- package net.biancheng.c.interpreter;
- import org.springframework.expression.Expression;
- import org.springframework.expression.ExpressionParser;
- import org.springframework.expression.spel.standard.SpelExpressionParser;
- public class Test {
- public static void main(String[] args) {
- ExpressionParser parser = new SpelExpressionParser();
- Expression expression = parser.parseExpression("100*2+400*1+66");
- int result = (Integer) expression.getValue();
- System.out.println("计算结果是:" + result);
- }
- }
计算结果是:666
由运行结果可以看到,运行结果与预期结果是一致的。解释器模式一般在业务开发中用的相对较少,常用的表达式都有人解析好了,直接用就可以了,除非我们从事底层开发需要自己去定义较为复杂的表达式。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算