当前位置: 首页 > article >正文

23种设计模式之解释器模式

目录

  • 1. 简介
  • 2. 代码
    • 2.1 Expression (抽象表达式类)
    • 2.2 TerminalExpression (终结符表达式类)
    • 2.3 OrExpression (非终结符表达式类)
    • 2.4 AndExpression (非终结符表达式类)
    • 2.5 Test (客户端类)
    • 2.6 运行结果
  • 3. 优缺点
  • 4. 总结

1. 简介

解释器模式(Interpreter Pattern) 是一种行为设计模式。它给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
例如,对于一个简单的数学表达式语言,如 “3 + 4”,解释器模式可以用来解析和计算这个表达式。它把表达式拆分成数字和运算符等语法元素,然后按照一定的规则进行解释和计算。

解释器模式的结构

  • 抽象表达式(Abstract Expression)类
    这是所有具体表达式类的父类,它声明了一个抽象的解释方法。
  • 终结符表达式(Terminal Expression)类
    终结符表达式是文法中的终结符,它不能再被分解。在数学表达式中,数字就是终结符表达式。它实现了抽象表达式类中的解释方法,用于返回自身的值。
  • 非终结符表达式(Non - terminal Expression)类
    非终结符表达式包含一个或多个表达式,可以对包含的表达式进行操作。在数学表达式中,加法、减法等运算符对应的表达式就是非终结符表达式。它们通过调用子表达式的解释方法来实现自身的解释。
  • 客户端(Client)类
    客户端类负责构建表达式的抽象语法树,并调用解释器来解释表达式。

2. 代码

2.1 Expression (抽象表达式类)

public interface Expression {
    public boolean interpret(String context);
}

2.2 TerminalExpression (终结符表达式类)

public class TerminalExpression implements Expression{
    private String data;

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

    public boolean interpret(String context)
    {
        if(context.contains(data))
            return true;
        else
            return false;
    }
}

2.3 OrExpression (非终结符表达式类)

public class OrExpression implements Expression{
    private Expression expression1;
    private Expression expression2;

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

    public boolean interpret(String context)
    {
        return expression1.interpret(context) || expression2.interpret(context);
    }
}

2.4 AndExpression (非终结符表达式类)

public class AndExpression implements Expression{
    private Expression expression1;
    private Expression expression2;

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

    public boolean interpret(String context)
    {
        return expression1.interpret(context) && expression2.interpret(context);
    }
}

2.5 Test (客户端类)

public class Test {
    public static void main(String[] args) {
        Expression isMale = new TerminalExpression("male");
        Expression isMarriedWoman = new AndExpression(new TerminalExpression("married"),
                new TerminalExpression("woman"));
        System.out.println("John is male? " + isMale.interpret("John male"));
        System.out.println("Julie is a married women? " + isMarriedWoman.interpret("married woman"));
        System.out.println("Jake is a married women? " + isMarriedWoman.interpret("married man"));
    }
}

2.6 运行结果

John is male? true
Julie is a married women? true
Jake is a married women? false

3. 优缺点

  • 解释器模式的优点
    • 易于实现简单的语言解释器
      对于一些简单的特定领域语言(DSL),如简单的配置文件语法或者简单的数学表达式语言,解释器模式可以很方便地实现解析和执行。
    • 灵活性好
      可以方便地修改和扩展语法规则。如果要添加新的运算符或者语法元素,只需要创建新的表达式类并修改相应的解释逻辑即可。
  • 解释器模式的缺点
    • 复杂语法难以维护
      当语言的文法变得复杂时,解释器模式会导致大量的类,而且语法规则的维护和修改会变得非常困难。例如,对于一个完整的编程语言,使用解释器模式来实现整个语法解析和执行会非常复杂。
    • 效率可能较低
      解释器模式通常采用递归调用等方式来解释表达式,对于复杂的表达式或者大量的表达式解释,可能会导致性能问题,比如占用较多的内存和计算资源。

4. 总结


http://www.kler.cn/a/428355.html

相关文章:

  • Flink运行时架构
  • Python 预训练:打通视觉与大语言模型应用壁垒——Python预训练视觉和大语言模型
  • 数据分析 six库
  • 机器学习-使用梯度下降最小化均方误差
  • C#集合操作优化:高效实现批量添加与删除
  • 从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑
  • 【PlantUML系列】状态图(六)
  • 2-2-18-14 QNX系统架构之 TCP/IP 网络
  • 保护数字资产:iOS 加固在当前安全环境中的重要性
  • ChatGPT Pro是什么
  • 【机器人】系统辨识之激励轨迹设计(傅里叶级数)
  • 原生微信小程序使用原子化tailwindcss
  • 阿里云负载均衡SLB实践
  • 在 Ubuntu 18.04 上使用 Snort 的完整攻略
  • LVGL9 开关控件 (lv_switch) 使用指南
  • java+ssm+mysql水产品商城
  • 重读《人月神话》(17)-没有银弹-软件工程中的根本和次要问题
  • C/C++ 堆和优先队列
  • 深度剖析 K 近邻算法:分类、回归实战及优劣势分析
  • 电脑启动过程
  • okHttp的tcp连接池的复用
  • 记录一次使用git无权限的问题排查
  • 【MIT-OS6.S081作业1.4】Lab1-utilities find
  • 漫画之家系统:Spring Boot技术下的漫画爱好者天堂
  • Unity3D常见的设计模式(四)
  • 【Apache Paimon】-- 8 -- flink 创建 paimon connecor 的两种方式