解释器模式

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子

实例(简易加减法解释器,单个数字不大于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));
}
}
}
 

结果

 通常不在重要模块使用,避免过于复杂难以维护

posted @ 2020-02-28 17:37  Camcay  阅读(158)  评论(0)    收藏  举报