GOF 设计模式小白教程之解释器模式

本贴最后更新于 1939 天前,其中的信息可能已经时移世改

解释器模式(Interpreter)

定义:

给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。

通俗解释:

我们可以用一个最最简单的计算器程序来举例,该计算器只有加法和减法并且不能加括号。我们通过输入一串简单的表达式例如:1+3+4-5 然后根据计算得出结果为 3。这其中的每个数值和符号都属于一个表达式。每种表达式都对应一种功能,可以是保存数值的功能,也可以是计算数值的功能。解释器模式其实我们在实际业务开发中比较少碰到,例如渲染页面的标签语言或者 Spring EL 表达式也属于也属于解释器模式。总得来说,解释器相当于一个傻瓜版的编译器。

代码:

表达式接口,拥有解释方法

public interface Expresion {
    // 解释翻译
    int interprete();

}

加法表达式

public class AddExpression implements Expresion {

    private Expresion left;
    private Expresion right;

    public AddExpression(Expresion left, Expresion right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interprete() {
        return left.interprete() + right.interprete();
    }

}

减法表达式

public class MinusExpression implements Expresion {

    private Expresion left;
    private Expresion right;

    public MinusExpression(Expresion left, Expresion right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interprete() {
        return left.interprete() - right.interprete();
    }


}

数值表达式

public class ValueExpression implements Expresion{

    private int value;

    public ValueExpression(int value) {
        this.value = value;
    }

    @Override
    public int interprete() {
        return value;
    }

}

测试解释器模式,通过将 1+3+4-5 翻译成一串表达式的组合,我们省略了这个 Parse 语句转化成表达式组合的过程,也省略了 Context 环境变量类(存储变量名和值的键值对),因为我们直接用数值进行计算没有用变量。

public class TestInterpreter {

    public static void main(String[] args) {

        // 我们省略了将表达式Parse的过程和Context环境变量类
        // 1+3+4-5
        int result = new MinusExpression(new AddExpression(new AddExpression(new ValueExpression(1),
                new ValueExpression(3)), new ValueExpression(4)),new ValueExpression(5)).interprete();

        System.out.println("计算结果为:" + result);

    }

}

运行结果:

计算结果为:3

解析:

  1. 扩展性好。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。
  2. 容易实现。在语法树中的每个表达式节点类都是相似的,所以实现其文法较为容易。
  3. 可利用场景比较少。对于复杂的文法比较难维护,且会引起类膨胀。
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...