解释器模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
实例(简易加减法解释器,单个数字不大于10)
public interface Expression { int operation(); } //解释数字 public class VarExpression implements Expression { private int value; public VarExpression(int value){ this.value = value; } @Override public int operation() { return value; } } //解释减法 public class SubExpression implements Expression { private int left; private int right; public SubExpression(int left, int right){ this.left = left; this.right = right; } @Override public int operation() { return left - right; } } //解释加法 public class AddExpression implements Expression { private int left; private int right; public AddExpression(int left,int right){ this.left = left; this.right = right; } @Override public int operation() { return left + right; } }
public class Calculator {
private int left;
private int right;
public int operation(List<String> list) {
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < list.size(); i++) {
switch (list.get(i)) {
case "+":
left = stack.pop();
right = Integer.valueOf(list.get(++i));
stack.push(new AddExpression(left, right).operation());
break;
case "-":
left = stack.pop();
right = Integer.valueOf(list.get(++i));
stack.push(new SubExpression(left, right).operation());
break;
default:
stack.push(Integer.valueOf(list.get(i)));
}
}
return stack.pop();
}
}
//测试
public class Client {
public static void main(String[] args) {
Calculator calculator = new Calculator();
while (true) {
List<String> list = new ArrayList<>();
System.out.println("输入计算公式");
Scanner input = new Scanner(System.in);
String str = input.nextLine();
String var;
for (char c : str.toCharArray()) {
if (c != '+' && c != '-') {
System.out.print(c + "=");
var = input.nextLine();
list.add(var);
} else {
list.add(String.valueOf(c));
}
}
System.out.println(str + "=" + calculator.operation(list));
}
}
}
结果

通常不在重要模块使用,避免过于复杂难以维护
语言是思想的载体

浙公网安备 33010602011771号