- Spring框架中SpelExpressionParser使用到了解释器模式
public class Interpreter {
public static void main(String[] args) {
SpelExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("100 * (2 + 400) * 1 + 66");
int result = (Integer) expression.getValue();
System.out.println(result);
}
}
public interface ExpressionParser {
Expression parseExpression(String expressionString) throws ParseException;
Expression parseExpression(String expressionString, ParserContext context) throws ParseException;
}
# 查看实现
public abstract class TemplateAwareExpressionParser implements ExpressionParser {
public Expression parseExpression(String expressionString, ParserContext context) { // 不同情况返回不同的Express.
}
}
public class SpelExpressionParser extends TemplateAwareExpressionParser{}
class InternalSpelExpressionParser extends TemplateAwareExpressionParser{}
Expression 接口 表达式接口
下面有不同的实现类,比如SpelExpression, 或者CompositeStringExpression。
使用时候,根据你创建的不同的Parser 对象,返回不同的 Expression 对象
public Expression parseExpression(String expressionString, ParserContext context) throws ParseException {
if (context == null) {
context = NON_TEMPLATE_PARSER_CONTEXT;
}
if (context.isTemplate()) {
return parseTemplate(expressionString, context); //返回的就是 CompositeStringExpression
}
else {
return doParseExpression(expressionString, context); //返回的就是 SpelExpression
}
}
使用得当 Expression对象,调用getValue 解释执行 表达式,最后得到结果
1) 当有一个语言需要解释执行,可将该语言中的句子表示为一个抽象语法树,就可以考虑使用解释器模式,让程序具有良好的扩展性
2) 应用场景:编译器、运算表达式计算、正则表达式、机器人等
3) 使用解释器可能带来的问题:解释器模式会引起类膨胀、解释器模式采用递归调用方法,将会导致调试非常复杂、效率可能降低