设计模式 - 解释器模式

目录

[一. 前言](#一. 前言)

[二. 实现](#二. 实现)

[三. 优缺点](#三. 优缺点)


一. 前言

解释器模式(Interpreter Pattern)指给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子,属于行为型设计模式。是一种按照规定的文法(语法)进行解析的模式。其核心思想就是识别文法,构建解释。

二. 实现

TerminalExpression: 终结符表达式,每个终结符都需要一个 TerminalExpression。

NonterminalExpression:非终结符表达式,实现文法中与非终结符有关的解释操作。

Context: 上下文,包含解释器之外的一些全局信息。

案例:以下是一个规则检验器实现,具有 and 和 or 规则,通过规则可以构建一颗解析树,用来检验一个文本是否满足解析树定义的规则。

例如一颗解析树为 D And (A Or (B C)),文本 "D A" 满足该解析树定义的规则。

这里的 Context 指的是 String。

java 复制代码
public abstract class Expression {
    public abstract boolean interpret(String str);
}
java 复制代码
public class TerminalExpression extends Expression {
    private String literal = null;

    public TerminalExpression(String str) {
        literal = str;
    }

    public boolean interpret(String str) {
        StringTokenizer st = new StringTokenizer(str);
        while (st.hasMoreTokens()) {
            String test = st.nextToken();
            if (test.equals(literal)) {
                return true;
            }
        }
        return false;
    }
}
java 复制代码
public class AndExpression extends Expression {
    private Expression expression1 = null;
    private Expression expression2 = null;

    public AndExpression(Expression expression1, Expression expression2) {
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    public boolean interpret(String str) {
        return expression1.interpret(str) && expression2.interpret(str);
    }
}
java 复制代码
public class OrExpression extends Expression {
    private Expression expression1 = null;
    private Expression expression2 = null;

    public OrExpression(Expression expression1, Expression expression2) {
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    public boolean interpret(String str) {
        return expression1.interpret(str) || expression2.interpret(str);
    }
}
java 复制代码
public class Client {
    /**
     * 构建解析树
     */
    public static Expression buildInterpreterTree() {
        // Literal
        Expression terminal1 = new TerminalExpression("A");
        Expression terminal2 = new TerminalExpression("B");
        Expression terminal3 = new TerminalExpression("C");
        Expression terminal4 = new TerminalExpression("D");
        // B C
        Expression alternation1 = new OrExpression(terminal2, terminal3);
        // A Or (B C)
        Expression alternation2 = new OrExpression(terminal1, alternation1);
        // D And (A Or (B C))
        return new AndExpression(terminal4, alternation2);
    }

    public static void main(String[] args) {
        Expression define = buildInterpreterTree();
        String context1 = "D A";
        String context2 = "A B";
        System.out.println(define.interpret(context1));
        System.out.println(define.interpret(context2));
    }
}
java 复制代码
true
false

三. 优缺点

优点:

  1. 由于语法由很多类表示,所以,当语法规则或者扩展语法时,只需要修改或者扩展表达式即可。

  2. 对于简单的文法应当比较简单且易于实现,过于复杂的语法并不适合解释器模式。

缺点:

1.由于语法由很多类表示,过于复杂时,会产生大量的解释类,引起类臃肿,增加系统维护的难度。

  1. 解释器模式采用递归调用方法,当完整表达式层级较深时,解释效率会下降。

JDK中的解释器模式

java.util.Pattern

java.text.Normalizer

javax.el.ELResolver

相关推荐
杨充10 小时前
10.可测试性实战设计
设计模式·开源·代码规范
杨充10 小时前
9.重构十二式的实战
设计模式·开源·代码规范
杨充11 小时前
6.设计原则的全景图
设计模式·开源·全栈
杨充11 小时前
2.面向对象的特性
设计模式
杨充11 小时前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充11 小时前
8.反模式与坏味道
设计模式·开源·代码规范
杨充11 小时前
3.接口vs抽象类比较
设计模式
咖啡八杯14 小时前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法
咖啡八杯1 天前
GoF设计模式——解释器模式
java·后端·spring·设计模式