设计模式 - 解释器模式

目录

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

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

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


一. 前言

解释器模式(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

相关推荐
金池尽干27 分钟前
设计模式之——观察者模式
观察者模式·设计模式
也无晴也无风雨41 分钟前
代码中的设计模式-策略模式
设计模式·bash·策略模式
捕鲸叉10 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点10 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰10 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus10 小时前
java设计模式之策略模式
java·设计模式·策略模式
暗黑起源喵10 小时前
设计模式-迭代器
设计模式
lexusv8ls600h12 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式
sniper_fandc15 小时前
抽象工厂模式
java·设计模式·抽象工厂模式
无敌岩雀17 小时前
C++设计模式结构型模式———外观模式
c++·设计模式·外观模式