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

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;elsereturn 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.lryc.cn/news/500318.html

相关文章:

  • Postgresql内核源码分析-表数据膨胀是怎么回事
  • github使用SSH进行克隆仓库
  • 【Linux系统】 Linux内核与UNIX设计哲学的结合
  • 以太网PHY_RGMII通信(基于RTL8211)--FPGA学习笔记22
  • PowerShell 脚本实战:解决 GitLab 仓库文件批量重命名难题
  • 数据分析及应用:滴滴出行打车日志数据分析
  • Odoo :一款免费且开源的食品生鲜领域ERP管理系统
  • 请求路径中缺少必需的路径变量[xxxId]
  • 【在Linux世界中追寻伟大的One Piece】HTTP cookie
  • COLA学习之DDD各种术语分析(一)
  • Pygments:高效的语法高亮工具
  • 算法-字符串-43.字符串相乘
  • linux的vdagent框架设计
  • CV工程师专用键盘开源项目硬件分析
  • qtcanpool 知 08:Docking
  • Milvus向量数据库01-基础概念
  • mysql备份数据库
  • NLP与LLM的工程化实践与学习思考 - 写在开头
  • LeetCode322. 零钱兑换(2024冬季每日一题 28)
  • Unix、GNU、BSD 风格中 ps 参数的区别
  • 单片机读写内部flash实现断电数据存储
  • 注意力机制介绍
  • 爬虫运行后数据如何存储?
  • C# 自动自定义截图的内容
  • Java的Stream流:文件处理、排序与串并行流的全面指南
  • [Maven]下载安装、使用与简介
  • 056 WXML+ WXSS+PHP+LW+校园配送商城微信小程序开发与设计 源码 文档 全套资料
  • Python 在同一/或不同PPT文档之间复制幻灯片
  • C#生成CSR(CertificateSigningRequest)和密钥
  • Docker 安装 Oracle创建表空间并导入数据库