解释器模式

1类图

这里写图片描述

2定义:

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

3使用场景

3.1 如果某个简单的语言需要解释执行并且可以将语言中的语句表示为一个抽象语法树时可以考虑使用解释器模式。

3.2 在某些特定的领域出现不断重复的问题时,可以将该领域的问题转化为一种语法规则下的语句,然后构建解释器来解释该语句。

4抽象的解释器

public abstract class ArithmeticExpression {
    public abstract int interpret();
}

5数字解释器

public class NumExpression extends ArithmeticExpression {

    private int num;

    public NumExpression(int num){
        this.num = num;
    }

    @Override
    public int interpret() {
        return num;
    }

}

6运算符号抽象解释器

public abstract class OperatorExpression extends ArithmeticExpression {
    protected ArithmeticExpression exp1,exp2;

    public OperatorExpression(ArithmeticExpression exp1,ArithmeticExpression exp2){
        this.exp1 = exp1;
        this.exp2 = exp2;
    }
}

7加法运算抽象解释器

public class additionExpression extends OperatorExpression {

    public additionExpression(ArithmeticExpression exp1, ArithmeticExpression exp2) {
        super(exp1, exp2);
        // TODO Auto-generated constructor stub
    }

    @Override
    public int interpret() {
        // TODO Auto-generated method stub
        return exp1.interpret() + exp2.interpret();
    }

}

8处理与解释相关业务逻辑

public class Calculator {

    private Stack<ArithmeticExpression> mExpeStack = new Stack<>();
    public Calculator(String expression) {
        ArithmeticExpression exp1,exp2;
        String[] element = expression.split(" +");
        for(int i = 0; i < element.length; i++){
            switch(element[i].charAt(0)){
                case '+':
                    exp1 = mExpeStack.pop();
                    exp2 = new NumExpression(Integer.valueOf(element[++i]));
                    mExpeStack.push(new additionExpression(exp1, exp2));
                    break;
                default:
                    mExpeStack.push(new NumExpression(Integer.valueOf(element[i])));
                    break;
            }
        }
    }
    public int calculate(){
        return mExpeStack.pop().interpret();
    }
}

9客户端

public class Client {
    public static void main(String[] args) {
        Calculator c = new Calculator("153 + 3589 + 118 + 555");
        System.out.println(c.calculate());
        System.out.println(153 + 3589 + 118 + 555);
    }
}
发布了51 篇原创文章 · 获赞 12 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章