解释器模式
定义:
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
如同开发了一个编程语言会脚本给自己、别人用。
就是用‘迷你语言’来表现程序要解决的问题,用迷你语言写成‘迷你程序’来表现具体的问题。
针对问题:
一种特定类型的问题发生的频率足够高,就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
当有一个语言需要解释执行,并且可将该语言中的句子表示为一个抽象语法树。
例如:
1.正则表达式,用于搜索匹配的字符;或,判断一个字符是否符合规定的格式。
这些需求都非常类似,与其为每一个特定的需求都写一个算法函数,不如使用一种通用的搜索算法来解释执行一个正则表达式,该正则表达式定义了带匹配字符串的集合。
解释器为正则表达式定义了一个文法:如何表示一个特定的正则表达式,如何解释这个正则表达式。
2.IE、Firefox……浏览器也在解释HTML文法,将HTML标记文本转换成网页格式显示给用户。
3.其他。只要是可以用语言来描述的,都可应用解释器模式。人工智能,机器人……
优点:
很容易地改变、扩展文法。因为该模式使用类来表示文法规则,可使用继承来改变或扩展改文法。
比较容易实现文法。以为定义抽象语法树中各个节点的类的实现答题类似,这些类都易于直接编写。
通过继承抽象表达式的方式,由于依赖倒转沿着,使文法的扩展、维护更加方便。
缺点:
为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理、维护。
Tip:
建议当文法非常复杂时,使用其他的技术,如:语法分析程序、编译器生成器来处理。
结构图:
AbstractExpression
TerminalExpression:实现抽象表达式中所要求的接口,主要是一个interpret()。文法中每一个终结符都有一个具体终结表达式与之相对应。
NonterminalExpression:通过实现抽象表达式的interpret()实现解释操作。解释操作以递归方式调用代表R1、R2、R3……Rn中各个符号的实例变量。
Context
客户端:构建表示该文法定义的语言中一个特定的句子的抽象语法树。调用解释操作。
结果:
示例:
音乐解释器
如果需要增加一个文法时。如,添加演奏速度……,只需添加一个速度类。客户端添加case即可。但是改动了客户端。
优化:在客户端那里应用:简单工厂+反射
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?