解释器模式

前言

解释器模式使用频率并不高,优势在于可以使用语法规则解析不少复杂的句子,语法规则可能简单,也可能容易,例如正则表达式来匹配数字字符串。正则表达式

目录

1、定义

是一种按照规定语法进行解析的方案,现实项目中使用偏少,其定义是,给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。markdown

2、模式原理分析

//1.抽象表达式
public interface Expression {
    boolean interpreter(String con);
}
//2.终结符表达式
public class TerminalExpression implements Expression{
    String data;

    public TerminalExpression(String data) {
        this.data = data;
    }

    @Override
    public boolean interpreter(String con) {
        if(con.contains(data)) {
            return true;
        } else {
            return false;
        }
    }

}

//3.1 非终结表达式
public class AndExpression implements Expression {
    Expression expr1;
    Expression expr2;

    public AndExpression(Expression expr1, Expression expr2) {
        this.expr1 = expr1;
        this.expr2 = expr2;
    }

    public boolean interpreter(String con) {
        return expr1.interpreter(con) && expr2.interpreter(con);
    }

}
//3.2 非终结表达式
public class OrExpression implements Expression {
    Expression expr1;
    Expression expr2;

    public OrExpression(Expression expr1, Expression expr2) {
        this.expr1 = expr1;
        this.expr2 = expr2;
    }

    public boolean interpreter(String con) {
        return expr1.interpreter(con) || expr2.interpreter(con);
    }
}
//3.3 非终结表达式
public class AndExpression implements Expression {
    Expression expr1;
    Expression expr2;

    public AndExpression(Expression expr1, Expression expr2) {
        this.expr1 = expr1;
        this.expr2 = expr2;
    }

    public boolean interpreter(String con) {
        return expr1.interpreter(con) && expr2.interpreter(con);
    }

}
//4. 场景类
public class Client {

    public static void main(String[] args) {
        Expression person1 = new TerminalExpression("mick");
        Expression person2 = new TerminalExpression("mia");
        Expression isSingle = new OrExpression(person1, person2);
        Expression spike = new TerminalExpression("spike");
        Expression mock = new TerminalExpression("mock");
        Expression isCommitted = new AndExpression(spike, mock);

        System.out.println(isSingle.interpreter("mick"));
        System.out.println(isSingle.interpreter("mia"));
        System.out.println(isSingle.interpreter("max"));
        System.out.println(isCommitted.interpreter("mock, spike"));
        System.out.println(isCommitted.interpreter("Single, mock"));

    }

}

//输出结果
true
true
false
true
false
复制代码

3、使用场景

  • 重复发生的问题能够使用解释器模式ide

  • 一个简单语法须要解释的场景,不过目前某些标准语法转化基本都被一些工具类所替换工具

4、优势

  • 容易扩展,修改语法,只须要修改响应的非终结表达式,扩展语法,只须要增长非终结表达式类便可

5、缺点

  • 执行效率低this

  • 解释器模式会引发类膨胀,维护成本高spa

  • 解释器模式采用递归调用方法,每一个表达式须要知道最终的结果,必须一层层的往下剥3d

相关文章
相关标签/搜索