//
//
// Generated by StarUML(tm) Java Add-In
//
// @ Project : Untitled
// @ File Name : Expression.java
// @ Date : 2016/8/25
// @ Author :
//
//
public abstract class Expression {
public abstract int interpret();
public abstract String toString();
}
public class NumberExpression extends Expression {
private int number;
public NumberExpression(int number) {
this.number = number;
}
public NumberExpression(String number) {
this.number = Integer.parseInt(number);
}
public int interpret() {
return number;
}
public String toString() {
return "number";
}
}
//
//
// Generated by StarUML(tm) Java Add-In
//
// @ Project : Untitled
// @ File Name : PlusExpression.java
// @ Date : 2016/8/25
// @ Author :
//
//
public class PlusExpression extends Expression {
private Expression leftExpression;
private Expression rightExpression;
public PlusExpression(Expression leftExpression, Expression rightExpression) {
this.leftExpression = leftExpression;
this.rightExpression = rightExpression;
}
public int interpret() {
return leftExpression.interpret() + rightExpression.interpret();
}
public String toString() {
return "+";
}
}
//
//
// Generated by StarUML(tm) Java Add-In
//
// @ Project : Untitled
// @ File Name : MinusExpression.java
// @ Date : 2016/8/25
// @ Author :
//
//
public class MinusExpression extends Expression {
private Expression leftExpression;
private Expression rightExpression;
public MinusExpression(Expression leftExpression, Expression rightExpression) {
this.leftExpression = leftExpression;
this.rightExpression = rightExpression;
}
public int interpret() {
return leftExpression.interpret() - rightExpression.interpret();
}
public String toString() {
return "0";
}
}
//
//
// Generated by StarUML(tm) Java Add-In
//
// @ Project : Untitled
// @ File Name : MultiplyExpression.java
// @ Date : 2016/8/25
// @ Author :
//
//
public class MultiplyExpression extends Expression {
private Expression leftExpression;
private Expression rightExpression;
public MultiplyExpression(Expression leftExpression, Expression rightExpression) {
this.leftExpression = leftExpression;
this.rightExpression = rightExpression;
}
public int interpret() {
return leftExpression.interpret() * rightExpression.interpret();
}
public String toString() {
return "*";
}
}
import java.util.Stack;
/*
* 解释器模式解释语句到表达式(Expression)能生成结果
*/
public class App {
public static void main(String[] args) {
String tokenString = "4 3 2 - 1 + *";
Stack<Expression> stack = new Stack<>();
String[] tokenList = tokenString.split(" ");
for(String s : tokenList)
{
if(isOperator(s))
{
Expression rightExpression = stack.pop();
Expression leftExpression = stack.pop();
System.out.println(String.format("popped from stack left: %d right: %d",
leftExpression.interpret(),rightExpression.interpret()));
Expression operator = getOperatorInstance(s,leftExpression,rightExpression);
System.out.println(String.format("operator:%s",operator));
int result = operator.interpret();
NumberExpression resultExpression = new NumberExpression(result);
stack.push(resultExpression);
System.out.println(String.format("push result to stack: %d",
resultExpression.interpret()));
} else {
Expression i = new NumberExpression(s);
stack.push(i);
System.out.println(String.format("push to stack: %d",
i.interpret()));
}
}
System.out
.println(String.format("result: %d", stack.pop().interpret()));
}
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);
}
return null;
}
private static boolean isOperator(String s) {
return s.equals("+") || s.equals("-") || s.equals("*");
}
}
/*push to stack: 4
push to stack: 3
push to stack: 2
popped from stack left: 3 right: 2
operator:0
push result to stack: 1
push to stack: 1
popped from stack left: 1 right: 1
operator:+
push result to stack: 2
popped from stack left: 4 right: 2
operator:*
push result to stack: 8
result: 8*/
java设计模式进阶_interpreter
最新推荐文章于 2019-01-18 12:04:10 发布