设计模式之美学习-行为型-解释器模式(三十五)
什么是解释器模式
解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法
需求
如“韶粵通”公交车读卡器可以判断乘客的身份,如果是“韶关”或者“广州”的“老人” “妇女”“儿童”就可以免费乘车,其他人员乘车一次扣 2 元。
表达式
<expression> ::= <city>的<person> //分隔符 <city> ::= 韶关|广州 //城市 <person> ::= 老人|妇女|儿童 //对象
代码实现
package interpreterPattern; import java.util.*; /*文法规则 <expression> ::= <city>的<person> <city> ::= 韶关|广州 <person> ::= 老人|妇女|儿童 */ public class InterpreterPatternDemo { public static void main(String[] args) { Context bus=new Context(); bus.freeRide("韶关的老人"); bus.freeRide("韶关的年轻人"); bus.freeRide("广州的妇女"); bus.freeRide("广州的儿童"); bus.freeRide("山东的儿童"); } } //抽象表达式类 //定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。 interface Expression { public boolean interpret(String info); } //终结符表达式(Terminal Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应 class TerminalExpression implements Expression { private Set<String> set= new HashSet<String>(); public TerminalExpression(String[] data) { for(int i=0;i<data.length;i++)set.add(data[i]); } public boolean interpret(String info) { if(set.contains(info)) { return true; } return false; } } //非终结符表达式(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。 class AndExpression implements Expression { private Expression city=null; private Expression person=null; public AndExpression(Expression city,Expression person) { this.city=city; this.person=person; } public boolean interpret(String info) { String s[]=info.split("的"); return city.interpret(s[0])&&person.interpret(s[1]); } } //环境类环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。 class Context { private String[] citys={"韶关","广州"}; private String[] persons={"老人","妇女","儿童"}; private Expression cityPerson; public Context() { //终结符表达式类 Expression city=new TerminalExpression(citys); Expression person=new TerminalExpression(persons); //非终结符表达式类 cityPerson=new AndExpression(city,person); } public void freeRide(String info) { boolean ok=cityPerson.interpret(info); if(ok) System.out.println("您是"+info+",您本次乘车免费!"); else System.out.println(info+",您不是免费人员,本次乘车扣费2元!"); } }
说明
解释器模式在实际的系统开发中使用的非常少,因为它会引起效率、性能以及维护等问题,一般在大中型的框架型项目能够找到它的身影,比如一些数据分析工具、报表设计工具、科学计算工具等等,
若你确实遇到“一种特定类型的问题发生的频率足够高”的情况,准备使用解释器模式时,可以考虑一下Expression4J、MESP(Math Expression String Parser)、Jep等开源的解析工具包(这三个开源产品都可以百度、Google中搜索到,请读者自行查询),
功能都异常强大,而且非常容易使用,效率也还不错,实现大多数的数学运算完全没有问题,自己没有必要从头开始编写解释器
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!