设计模式之解释器模式
# 设计模式之解释器模式
# 一、简介
定义了一个解释器,用来解释给定语言和文法的句子。其实就是把语言中的每个符号定义成一个(对象)类,从而把语言转换成一个具体的对象树
# 二、实现方式
实现一个简单的计算器,支持加减法 ,其中+-是非终结符表达式,其它的是终结符表达式,最后将表达式解析成一个树形结构
AbstractExpression:抽象表达式
/** * 抽象表达式 * 为所有解释器的基础类 */ public interface AbstractExpression { void interpret(String context); }
1
2
3
4
5
6
7TerminalExpression:终结符表达式
/** * 终结符表达式 */ 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
12NonTerminalExpression:非终结符表达式。实现文法中与非终结符有关的解释操作
/** * 非终结符表达式(组合式表达式)-- (+)操作 */ 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
14Context:上下文环境类。包含除解释器之外全局信息
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18