java interpreter_解释器模式-Interpreter(Java实现)

解释器模式-Interpreter

目前没有想到其他更好的例子, 以后本文肯定重写,或者尽力介绍得更到位....目前只是copy了iluwatar大神的代码, 作为练习, 也方便自己以后查找本段代码.

Expression接口

表达式的统一定义.

public interface Expression {

int interpret();

@Override

String toString();

}

PlusExpression类

加法表达式.

/**

* 加号

*/

public class PlusExpression implements Expression {

private Expression leftExpression;

private Expression rightExpression;

public PlusExpression(Expression leftExpression, Expression rightExpression) {

this.leftExpression = leftExpression;

this.rightExpression = rightExpression;

}

@Override

public int interpret() {

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

}

@Override

public String toString() {

return "+";

}

}

MinusExpression类

减法表达式.

/**

* 减号

*/

public class MinusExpression implements Expression {

private Expression leftExpression;

private Expression rightExpression;

public MinusExpression(Expression leftExpression, Expression rightExpression) {

this.leftExpression = leftExpression;

this.rightExpression = rightExpression;

}

@Override

public int interpret() {

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

}

@Override

public String toString() {

return "-";

}

}

MultiplyExpression类

乘法表达式.

/**

* 乘号

*/

public class MultiplyExpression implements Expression {

private Expression leftExpression;

private Expression rightExpression;

public MultiplyExpression(Expression leftExpression, Expression rightExpression) {

this.leftExpression = leftExpression;

this.rightExpression = rightExpression;

}

@Override

public int interpret() {

return leftExpression.interpret() * rightExpression.interpret();

}

@Override

public String toString() {

return "*";

}

}

NumberExpression类

数字也是一种表达式. 或者叫做语句中的一类元素

/**

* 数字

*/

public class NumberExpression implements Expression {

private int number;

public NumberExpression(int number) {

this.number = number;

}

public NumberExpression(String s) {

this.number = Integer.parseInt(s);

}

@Override

public int interpret() {

return number;

}

@Override

public String toString() {

return "number";

}

}

App类

运行/场景模拟

import java.util.Stack;

public class App {

public static void main(String[] args) {

String tokenString = "4 3 2 - 1 + *";

Stack stack = new Stack<>();

String[] tokenList = tokenString.split(" ");

for (String s : tokenList) {

if (isOperator(s)) {

Expression rightExpression = stack.pop();

Expression leftExpression = stack.pop();

System.out.printf("popped from stack left: %s right: %s\n",

leftExpression.interpret(), rightExpression.interpret());

Expression operator = getOperatorInstance(s, leftExpression, rightExpression);

System.out.printf("operator: %s\n", operator);

int result = operator.interpret();

NumberExpression resultExpression = new NumberExpression(result);

stack.push(resultExpression);

System.out.printf("push result to stack: %s\n", resultExpression.interpret());

} else {

Expression i = new NumberExpression(s);

stack.push(i);

System.out.printf("push to stack: %s\n", i.interpret());

}

}

System.out.printf("result: %s\n", stack.pop().interpret());

}

private static boolean isOperator(String s) {

return s.equals("+") || s.equals("-") || s.equals("*");

}

private static Expression getOperatorInstance(String s, Expression left, Expression right) {

switch (s) {

case "+":

return new PlusExpression(left, right);

case "-":

return new MinusExpression(left, right);

case "*":

return new MultiplyExpression(left, right);

default:

return new MultiplyExpression(left, right);

}

}

}

运行结果如下:

f47662e2ee34a3d87dfe2e808cb5256f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值