解释器模式
public abastract class Expression {
public abstract int interpreter ( HashMap< String, Integer> var) ;
}
public class VarExpression extends Expression {
private String key;
public VarExpression ( String key) {
this . key = key;
}
public int interpreter ( HashMap< String, Integer> var) {
return var. get ( this . key) ;
}
}
public class SymbolExpression extends Expression {
protected Expression left;
protected Expression right;
public SymbolExpression ( Expression left, Expression right) {
this . left = left;
this . right = right;
}
public int interpreter ( HashMap< String, Integer> var) {
return 0 ;
}
}
public class AddExpression extends SymbolExpression {
public addExpression ( Expression left, Expression right) {
super ( left, right) ;
}
public int interpreter ( HashMap< String, Integer> var) {
return super . left. interpreter ( var) + super . right. interpreter ( var) ;
}
}
public class SubExpression extends SymbolExpression {
public SubExpression ( Expression left, Expression right) {
super ( left, right) ;
}
public int interpreter ( HashMap< String, Integer> var) {
return super . left. interpreter ( var) - super . right. interpreter ( var) ;
}
}
public class Calculator {
private Expression expression;
public Calculator ( String expStr) {
Stack< Expression> stack = new Stack < > ( ) ;
char [ ] charArray = expStr. toCharArray ( ) ;
Expression left = null;
Expression right = null;
for ( int i= 0 ; i< charArray. length; i++ ) {
switch ( charArray[ i] ) {
case '+' :
left = stack. pop ( ) ;
right = new VarExpression ( String. valueOf ( charArray[ ++ i] ) ) ;
stack. push ( new AddExpression ( left, right) ) ;
break ;
case '-' :
left = stack. pop ( ) ;
right = new VarExpression ( String. valueOf ( charArray[ ++ i] ) ) ;
stack. push ( new SubExpression ( left, right) ) ;
break ;
default :
stack. push ( new VarExpression ( String. valueOf ( charArray[ i] ) ) ) ;
break ;
}
}
this . expression = stack. pop ( ) ;
}
public int run ( HashMap< String, Integer> var) {
return this . expression. interpreter ( var) ;
}
}