解释器模式(Interpreter Pattern)是一种行为设计模式,它提供了一种方式来表示语言或表达式的语法,并定义了如何解释这些表达式来执行特定任务。这种模式常用于小型语言或简单的表达式解析,例如配置文件、SQL查询构建器或者计算表达式等。
解释器模式的关键组件包括:
public interface Expression {
int interpreter(Map<String, Integer> variables);
}
public abstract class AbstractExpression implements Expression {
protected Expression left;
protected Expression right;
public AbstractExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
}
public class AddExpression extends AbstractExpression {
public AddExpression(Expression left, Expression right) {
super(left, right);
}
@Override
public int interpreter(Map<String, Integer> variables) {
return super.left.interpreter(variables) + super.right.interpreter(variables);
}
}
public class SubExpression extends AbstractExpression {
public SubExpression(Expression left, Expression right) {
super(left, right);
}
@Override
public int interpreter(Map<String, Integer> variables) {
return super.left.interpreter(variables) - super.right.interpreter(variables);
}
}
public class VarExpression implements Expression {
private String key;
public VarExpression(String key) {
this.key = key;
}
@Override
public int interpreter(Map<String, Integer> variables) {
return variables.get(key);
}
}
public class Calculator {
private Expression expression;
public Calculator(String expStr) {
Stack<Expression> stack = new Stack<>();
char[] charArray = expStr.toCharArray();
Expression left;
Expression right;
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])));
}
}
this.expression = stack.pop();
}
public int run(Map<String, Integer> variables) {
return this.expression.interpreter(variables);
}
}
https://gitee.com/youxiaxiaomage/java-practices/tree/master/yxxmg-gof-sample/src/main/java/com/yxxmg/gof/behavior/interpreter