设计模式之解释器模式

132 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

简介

解释器模式的定义是:

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

解释器模式虽然我们在开发实战中用到的机会不多,但是我们使用的很多工具都是基于解释器模式的思想,如定义中说明的SQL解析,各种逻辑引擎等。那如果我们要自己实现这类工具就可以考虑使用解释器模式。

我们还是来看下解释器模式中有哪些角色:

  • 表达式的抽象:用于定义一个抽象的表达式,定义一个解释的方法
  • 终结符表达式类:实现与文法中的终结符相关的解释操作
  • 非终结符表达式类:为文法中的非终结符实现解释操作
  • 环境:用于存放各个终结符对应的具体值

关于终结符表达式和非终结符表达式的的意思大家了解过编译原因可能就能明白,这里我理解意思是终结符是最小单位,不可再分,而非终结符是可以再分为2个或者多个终结符表达式的。

案例

我们通过一个简单的例子来说明解释器设计模式,用解释器模式来实现是否包含某字符串的判断:

首先我们定义一个抽象的表达式:

public interface Expression {
    public boolean interpret(String context);
}

然后定义终结符表达式的实现,构造方法传入data,解释方式逻辑是成员变量data是context的一部分

public class TerminalExpression implements Expression {
    private String data;
    public TerminalExpression(String data){
        this.data = data;
    }
    @Override
    public boolean interpret(String context) {
        if(context.contains(data)){
            return true;
        }
        return false;
    }
}

定义非终结符表达式,计时器的逻辑是两个终结符表达式的data是否都是context的一部分

public class OrExpression implements Expression {
    private Expression expr1 = null;
    private Expression expr2 = null;
    public OrExpression(Expression expr1, Expression expr2) {
        this.expr1 = expr1;
        this.expr2 = expr2;
    }
    @Override
    public boolean interpret(String context) {
        return expr1.interpret(context) || expr2.interpret(context);
    }
}

测试类

public class App {
    public static Expression getOrExp(){
        Expression hello = new TerminalExpression("Hello");
        Expression world = new TerminalExpression("World");
        return new OrExpression(hello, world);
    }
    public static void main(String[] args) {
        Expression exp = getOrExp();
        System.out.println(exp.interpret("Hello World"));
    }
}

总结

与其称为解释器,我认为这种设计模式也可以理解为解析判断器,对一段数据进行解析并根据制定的规则判断它是否符合要求。也比较类似正则表达式的意思。