likes
comments
collection
share

「设计模式」解释器模式

作者站长头像
站长
· 阅读数 20

一、概述

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。

解释器模式在开发中,可能比较少用,但是很常见,常见的有SQL解析,表达式解析等。

解释器模式的4种角色:

  1. 抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。
  2. 终结符表达式(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()方法。
  3. 非终结符表达式(Nonterminal Expression)角色:文法中的每一条规则都需要一个具体的非终结符表达式。
  4. 环境(Context)角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值。

二、优缺点

优点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。

缺点: 1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。 4、解释器模式采用递归调用方法。

三、实现方式

下面以数据内是否包含指定字符串实现一个丐版的SQL解释器为例。

「设计模式」解释器模式

抽象表达式类

public interface Expression {
    public boolean interpret(String 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;
    }
}

或运算实现类

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 AndExpression implements Expression{

    private Expression expr1 = null;

    private Expression expr2 = null;

    public AndExpression(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 Client {
    public static void main(String[] args) {
        Expression select = new TerminalExpression("Select");
        Expression from = new TerminalExpression("From");
        Expression isSelectFrom = new AndExpression(select, from);

        Expression insert = new TerminalExpression("Insert");
        Expression update = new TerminalExpression("Update");
        Expression isInsertOrUpdate = new OrExpression(insert, update);

        System.out.println(isSelectFrom.interpret("Select"));
        System.out.println(isInsertOrUpdate.interpret("Insert"));

        System.out.println(isSelectFrom.interpret("Select From"));
        System.out.println(isInsertOrUpdate.interpret("Update"));
    }
}

输出结果

false
true
true
true

四、常见应用场景

(1)SQL解析器

(2)表达式解析器

(3)符号处理引擎

转载自:https://juejin.cn/post/7145724715247042590
评论
请登录