元月's blog 元月's blog
首页
  • 基础
  • 并发编程
  • JVM
  • Spring
  • Redis篇
  • Nginx篇
  • Kafka篇
  • Otter篇
  • Shardingsphere篇
  • 设计模式
  • MySQL
  • Oracle
  • 基础
  • 操作系统
  • 网络
  • 数据结构
  • 技术文档
  • Git常用命令
  • GitHub技巧
  • 博客搭建
  • 开发工具
更多

元月

临渊羡鱼,不如退而结网
首页
  • 基础
  • 并发编程
  • JVM
  • Spring
  • Redis篇
  • Nginx篇
  • Kafka篇
  • Otter篇
  • Shardingsphere篇
  • 设计模式
  • MySQL
  • Oracle
  • 基础
  • 操作系统
  • 网络
  • 数据结构
  • 技术文档
  • Git常用命令
  • GitHub技巧
  • 博客搭建
  • 开发工具
更多
  • 设计模式

    • 设计模式简介
    • 设计模式之单例模式
    • 设计模式之工厂模式
    • 设计模式之原型模式
    • 设计模式之建造者模式
    • 设计模式之适配器模式
    • 设计模式之桥接模式
    • 设计模式之组合模式
    • 设计模式之装饰器模式
    • 设计模式之外观模式
    • 设计模式之享元模式
    • 设计模式之代理模式
    • 设计模式之责任链模式
    • 设计模式之命令模式
    • 设计模式之解释器模式
      • 一、简介
      • 二、实现方式
      • 三、应用场景
        • 1、Spring中解释器模式:表达式解析器SpelExpressionParser
      • 四、思维导图
    • 设计模式之迭代器模式
    • 设计模式之中介者模式
    • 设计模式之备忘录模式
    • 设计模式之观察者模式
    • 设计模式之状态模式
    • 设计模式之策略模式
    • 设计模式之模版模式
    • 设计模式之访问者模式
    • 设计模式辨析篇
  • 高可用

  • 系统设计
  • 设计模式
元月
2022-08-19
目录

设计模式之解释器模式

# 设计模式之解释器模式

# 一、简介

定义了一个解释器,用来解释给定语言和文法的句子。其实就是把语言中的每个符号定义成一个(对象)类,从而把语言转换成一个具体的对象树

# 二、实现方式

实现一个简单的计算器,支持加减法 ,其中+-是非终结符表达式,其它的是终结符表达式,最后将表达式解析成一个树形结构

  • AbstractExpression:抽象表达式

    /**
     * 抽象表达式
     * 为所有解释器的基础类
     */
    public interface AbstractExpression {
        void interpret(String context);
    }
    
    1
    2
    3
    4
    5
    6
    7
  • TerminalExpression:终结符表达式

    /**
     * 终结符表达式
     */
    public class TerminalExpression implements AbstractExpression {
        private int data;
        public TerminalExpression(int data) {
            this.data = data;
        }
        @Override
        public void interpret(String context) {
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
  • NonTerminalExpression:非终结符表达式。实现文法中与非终结符有关的解释操作

    /**
     * 非终结符表达式(组合式表达式)-- (+)操作
     */
    public class NonTerminalExpression implements AbstractExpression {
        private AbstractExpression expressionA;
        private AbstractExpression expressionB;
        public NonTerminalExpression(AbstractExpression expressionA, AbstractExpression expressionB) {
            this.expressionA = expressionA;
            this.expressionB = expressionB;
        }
        @Override
        public void interpret(String context) {
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
  • Context:上下文环境类。包含除解释器之外全局信息

  • Client:客户类。实际使用类

# 三、应用场景

SQL 解析、符号处理引擎

# 1、Spring中解释器模式:表达式解析器SpelExpressionParser

表达式解析器SpelExpressionParser将字符串解析成Expression对象,再通过上下文对象EvaluationContext获取执行结果

import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

public class Client {

  public static void main(String[] args) {
    SpelExpressionParser parser = new SpelExpressionParser();
    Expression expression = parser.parseExpression("#a+#b-#c");
    EvaluationContext context = new StandardEvaluationContext();
    context.setVariable("a",12);
    context.setVariable("b",34);
    context.setVariable("c",56);
    System.out.println(expression.getValue(context));//-10
  }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 四、思维导图

#设计模式
设计模式之命令模式
设计模式之迭代器模式

← 设计模式之命令模式 设计模式之迭代器模式→

最近更新
01
otter二次开发-支持按目标端主键索引Load数据
08-03
02
mvnw简介
06-21
03
gor流量复制工具
06-03
更多文章>
Theme by Vdoing | Copyright © 2022-2024 元月 | 粤ICP备2022071877号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式