Java设计模式--解释器模式

这种模式也是行为型模式,主要是对一些文法的解释。常见的有SQL解析,表达式解析。这种模式比较常见,但实现起来有一定难度,需要考虑的情况比较完善,这里简单举一个加减法计算器的例子:

解释器接口:

public interface Expression {
    int interpret();
}

具体各种解释器:

//数字解释器
public class NumExpression implements Expression{
    private int num;
    public NumExpression(int num){
        this.num = num;
    }

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

//操作符解释器抽象类
public abstract class OperatorExpression implements Expression{
    protected Expression exp1,exp2;

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

}

//加法解释器
public class AdditionExpression extends OperatorExpression{
    public AdditionExpression(Expression exp1, Expression exp2) {
        super(exp1, exp2);
    }

    @Override
    public int interpret() {
        return exp1.interpret() + exp2.interpret();
    }
}

//减法解释器
public class SubtractionExpression extends OperatorExpression{
    public SubtractionExpression(Expression exp1, Expression exp2) {
        super(exp1, exp2);
    }

    @Override
    public int interpret() {
        return exp1.interpret() - exp2.interpret();
    }
}

解释器执行者:

public class Calculator {
    private Stack<Expression> stack = new Stack<>();
    private String expression;

    public Calculator(String expression){
        this.expression = expression;
    }

    public int calculate(){
        Expression exp1,exp2;

        String[] elements = expression.split(" ");
        for (int i = 0;i<elements.length;i++){
            switch (elements[i].charAt(0)){
                case '+':
                    exp1 = stack.pop();
                    exp2 = new NumExpression(Integer.valueOf(elements[++i]));
                    stack.push(new AdditionExpression(exp1,exp2));
                    break;
                case '-':
                    exp1 = stack.pop();
                    exp2 = new NumExpression(Integer.valueOf(elements[++i]));
                    stack.push(new SubtractionExpression(exp1,exp2));
                    break;
                default:
                    stack.push(new NumExpression(Integer.valueOf(elements[i])));
                    break;
            }
        }

        return stack.pop().interpret();
    }
}

测试类

    public static void main(String[] args) {
        Calculator calculator = new Calculator("1 + 2 + 3 - 4");
        System.out.println(calculator.calculate());
    }

更复杂的比如涉及乘除法,括号,幂运算等,就要先对表达式进行转换,如转为后缀表达式,在书写对应解释器。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 定义 解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户...
    步积阅读 3,560评论 0 2
  • Java设计模式之解释器模式 这期开始跟大家分享行为模式,也是最后一类设计模式模式。 简介 解释器模式是定义一套规...
    icyage阅读 121评论 0 0
  • 解释器模式在我看来,应用范围很小,我想了很久,想举一个不是加减乘除运算的例子出来,但是很难......在设计模式一...
    Mock2052阅读 1,178评论 0 1
  • 春日有感 桃谢园未空,杜鹃花影重。孤蜂嗜蜜,群蝶竞舞,从容沐春风。 春深夜已浓,随处人影...
    茗兮啊阅读 280评论 0 2
  • “小彬彬,我问你一个问题,如果你遇到一个你喜欢的男生时,你会不会主动去追?” “亲爱的小灰灰,说好的陪我一起孤独终...
    chen扣扣阅读 4,598评论 7 12

友情链接更多精彩内容