解释器模式详解(定义作用及应用场景实例)

解释器模式详解(定义作用及应用场景实例)-mikechen

解释器模式定义

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

解释器模式这种模式被用在大家最为熟悉的,比如: SQL 解析、符号处理引擎等。

 

解释器模式角色

解释器模式包含5大角色,解释器模式uml图如下图所示:

解释器模式详解(定义作用及应用场景实例)-mikechen

1.抽象表达式Abstract Expression角色

抽象表达式:主要定义解释器的接口,约定解释器的解释操作。

2.终结符表达式Terminal Expression角色

终结符表达式:主要是抽象表达式的子类,用来实现文法中与终结符相关的操作。

3.非终结符表达式Nonterminal Expression角色

非终结符表达式:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。

4.环境Context角色

环境:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据。

5.客户端Client角色

客户端:主要任务是将需要分析的句子或表达式,转换成使用解释器对象描述的抽象语法树。

 

解释器模式案例

通过解释器模式实现一个逻辑与和逻辑或的语法翻译器,用于翻译问题内容,来看一下解释器的UML类图 。

如下图所示:

解释器模式详解(定义作用及应用场景实例)-mikechen

再来看一下代码如何实现:

1.先定义一个语法表达式接口Expression

public interface Expression {
    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;
    }
}

2.定义OrExpression语法翻译器

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) || expr1.interpret(context);
    }
}

3.定义AndExpression语法翻译器

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);
    }
}

4.定义客户端

public class InterpreterPatternDemo {

    //Rule: Robert and John are male
    public static Expression getMaleExpression(){
        Expression robert = new TerminalExpression("Robert");
        Expression john = new TerminalExpression("John");
        return new OrExpression(robert,john);
    }

    //Rule: Julie is a married women
    public static Expression getMarriedWomanExpression(){
        Expression julie = new TerminalExpression("Julie");
        Expression married = new TerminalExpression("Married");
        return new AndExpression(julie,married);
    }

    public static void main(String[] args){
        Expression isMale = getMaleExpression();
        Expression isMarriedWoman = getMarriedWomanExpression();

        System.out.println("John is male?"   isMale.interpret("John"));
        System.out.println("Julie is a married women?"   isMarriedWoman.interpret("Married Julie"));
    }
}

 

解释器模式应用场景

当有一个语言需要解释执行,并且可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式,例如:

  • MySQL中的SQL语句 解析;
  • JDK中Pattern对正则表达式的编译和解析;
  • Spring中ExpressionParser接口的使用;

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法