Java23种设计模式——23.行为型模式之解释器模式

Java中除去有设计原则之外,还有23中设计模式。

这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,而这些设计模式可以解决一些特定的问题。

并且在这些模式中,可以说是将语言的使用体现的淋漓尽致。

那我们今天要学习  行为型模式  中的  解释器模式  !

解释器模式

先来看看什么是解释器模式

通过百科,我们可以看到,啥也没有,这里我给大家说一下啥叫解释器模式,这个模式主要用来做什么的

这个模式主要通过一些相同或者相似的文字,字符,我们将这些字符、文字进行解释,然后来进行操作

解释器模式的定义与特点

解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。

这里提到的文法和句子的概念同编译原理中的描述相同,“文法”指语言的语法规则,而“句子”是语言集中的元素。例如,汉语中的句子有很多,“我是中国人”是其中的一个句子,可以用一棵语法树来直观地描述语言中的句子。

解释器模式是一种类行为型模式,其主要优点如下。

1. 扩展性好。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。

2. 容易实现。在语法树中的每个表达式节点类都是相似的,所以实现其文法较为容易。


解释器模式的主要缺点如下。

1. 执行效率较低。解释器模式中通常使用大量的循环和递归调用,当要解释的句子较复杂时,其运行速度很慢,且代码的调试过程也比较麻烦。

2. 会引起类膨胀。解释器模式中的每条规则至少需要定义一个类,当包含的文法规则很多时,类的个数将急剧增加,导致系统难以管理与维护。

3. 可应用的场景比较少。在软件开发中,需要定义语言文法的应用实例非常少,所以这种模式很少被使用到。

解释器模式的结构与实现

说这个模式,还得说一个东西,就是文法

文法

文法是用于描述语言的语法结构的形式规则。没有规矩不成方圆,例如,有些人认为完美爱情的准则是“相互吸引、感情专一、任何一方都没有恋爱经历”,虽然最后一条准则较苛刻,但任何事情都要有规则,语言也一样,不管它是机器语言还是自然语言,都有它自己的文法规则。

〈句子〉::=〈主语〉〈谓语〉〈宾语〉
〈主语〉::=〈代词〉|〈名词〉
〈谓语〉::=〈动词〉
〈宾语〉::=〈代词〉|〈名词〉
〈代词〉你|我|他
〈名词〉7大学生I筱霞I英语
〈动词〉::=是|学习

这里这个文法稍微简单看看,然后我们再看一下角色

1. 抽象表达式角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。

2. 终结符表达式角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。

3. 非终结符表达式角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。

4. 环境角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。

5. 客户端:主要任务是将需要分析的句子或表达式转换成使用解释器对象描述的抽象语法树,然后调用解释器的解释方法,当然也可以通过环境角色间接访问解释器的解释方法。

我们来弄一个简单的例子,就计算银行的存款利息

第一步:

我们先来定义一个抽象表达式角色

这个主要用来判断我们给传入的字符串是否符合对应的表达式的条件

第二步:

创建终结符表达式角色,并且实现抽象表达式角色

这里我们需要将我们要判断的字符进行存储,存在 Set 集合中,这样可以保证数据的唯一,不会重复判断,实现方法主要判断是否存在

第三步:

创建非终结符表达式角色,并也实现抽象表达式角色

这里我们到时候传入来一个终结符表达式的实体类,然后进行判断,是否都存在刚刚的 Set 集合中,如果都存在,说明我们的文本可以进行解释

第四步:

创建环境

这里我们需要定义公式,当然,公式的话我们肯定不止一个,如果有多个我们就写多个数组

 expression 是非终结符表达式角色,通过这个我们可以进行检测当前传入进来的这个公式是否匹配,如果匹配,我们获取本金、利率、时间进行乘法运算,并输出

测试:

我们弄一个 Test 类进行测试一下

输出一下

可以看到啊,这个计算结果是没有问题的

OK,就到这里,大家好好看一下。多多练习。有问题可以联系我QQ:2100363119

这是设计模式中最后一个模式,希望大家多去看看设计模式,说真的,面试的时候如果说精通 Java 设计模式,那我相信你的代码一定不差

最后欢迎大家访问我的个人网站:lemon1234.com 感谢大家留言

猜你喜欢

转载自blog.csdn.net/weixin_45908370/article/details/109696919