【设计模式系列20】解释器模式原理及其在JDK和Spring源码中的体现

总结

无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

面试了阿里,滴滴,网易,蚂蚁,最终有幸去了网易【面试题分享】

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

package com.zwx.design.pattern.interpreter;

/**

  • 非终结表达式-抽象表达式

*/

public abstract class AbstractNonTerminalExpression implements IExpression{

protected IExpression leftExpression;

protected IExpression rightExpression;

public AbstractNonTerminalExpression(IExpression leftExpression, IExpression rightExpression) {

this.leftExpression = leftExpression;

this.rightExpression = rightExpression;

}

}

3、因为本次示例中只列举加法和减法,所以我们还需要一个加法类和一个减法类:

package com.zwx.design.pattern.interpreter;

/**

  • 非终结表达式-具体表达式-加法表达式

*/

public class AddExpression extends AbstractNonTerminalExpression {

public AddExpression(IExpression leftExpression, IExpression rightExpression) {

super(leftExpression, rightExpression);

}

@Override

public int interpret() {

return this.leftExpression.interpret() + this.rightExpression.interpret();

}

}

package com.zwx.design.pattern.interpreter;

/**

  • 非终结表达式-具体表达式-减法表达式

*/

public class SubExpression extends AbstractNonTerminalExpression {

public SubExpression(IExpression leftExpression, IExpression rightExpression) {

super(leftExpression, rightExpression);

}

@Override

public int interpret() {

return this.leftExpression.interpret() - this.rightExpression.interpret();

}

}

4、再建立一个终结表达式(如加减法运算中的数值):

package com.zwx.design.pattern.interpreter;

/**

  • 终结表达式-数值表达式

*/

public class NumberExpression implements IExpression{

private int value;

public NumberExpression(String value) {

this.value = Integer.valueOf(value);

}

@Override

public int interpret() {

return this.value;

}

}

5、最后我们还需要一个上下文信息来存储我们的运算结果:

package com.zwx.design.pattern.interpreter;

import java.util.ArrayList;

import java.util.List;

import java.util.Stack;

public class ExpressionContext {

private Integer currValue;//记录当前运算结果,空表示暂未运算

private Stack stack = new Stack<>();

public ExpressionContext(String expression) {

this.parse(expression);

}

private void parse(String expression) {

String[] elementArr = expression.split(" ");

for (int i=0;i<elementArr.length;i++){

String element = elementArr[i];

if (element.equals(“+”)){

IExpression leftExpression = stack.pop();//栈内元素出栈

IExpression rightExpression = new NumberExpression(elementArr[++i]);//取出+号后的下一个元素

IExpression addExpression = new AddExpression(leftExpression,rightExpression);

stack.push(new NumberExpression(addExpression.interpret() + “”));//将计算结果入栈

}else if (element.equals(“-”)){

IExpression leftExpression = stack.pop();//栈内元素出栈

IExpression rightExpression = new NumberExpression(elementArr[++i]);//取出-号后的下一个元素

IExpression subExpression = new SubExpression(leftExpression,rightExpression);

stack.push(new NumberExpression(subExpression.interpret() + “”));//将计算结果入栈

}else{

stack.push(new NumberExpression(element));//如果是数字则直接入栈

}

}

}

public int calcuate(){

return stack.pop().interpret();//经过前面解析,到这里stack内只会剩下唯一一个数字,即运算结果

}

}

6、最后新建一个测试类来测试一下:

package com.zwx.design.pattern.interpreter;

public class TestInterpreter {

public static void main(String[] args) {

ExpressionContext context = new ExpressionContext(“666 + 888 - 777”);

System.out.println(context.calcuate());

context = new ExpressionContext(“123 - 456 + 11”);

System.out.println(context.calcuate());

}

}

运行结果为:

777

-322

解释器模式角色

====================================================================

从上面示例中,我们可以得出解释器模式主要有4个角色:

  • 抽象表达式(Expression):一般会定义一个解释方法,具体如何解析会交由子类进行实现(如示例中的IExpression)。

  • 终结符表达式(Terminal Expression):实现文法中与终结符有关的解释操作(如示例中的AddExpression,SubExpression)。

  • 非终符结表达式(Nonterminal Expression):实现文法中与非终结符有关的解释操作(如示例中的NumberExpression)。

  • 上下文环境(Context):包含解释器之外的全局信息。一般用来存放文法中各个终结符所对应的具体值。

解释器模式在JDK和Spring源码中应用

==================================================================================

最后

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

[外链图片转存中…(img-cel9wutA-1715488775152)]

[外链图片转存中…(img-9vSX59uO-1715488775152)]

[外链图片转存中…(img-qhJhoHCZ-1715488775153)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值