作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。
支持作者: 点赞、关注、留言~
大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案。大聪明本着“独乐乐不如众乐乐”的宗旨与大家分享一下设计模式的学习心得。
解释器模式 什么是解释器模式解释器模式(Interpreter Pattern)给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。它常被用在 SQL 解析、符号处理引擎等。
听完这解释器模式的定义是不是顿时感觉一脸懵?什么语法、表达式,都是些什么鬼?我们接着往下看
我们在定义中提到的文法可以将其理解为一种规则,就好比汉语中一句完整的话必须由“主谓宾”三者构成一样。而句子代表着符合文法规则的一种表现,可以简单理解成符合汉语规则的一句话;语言指的是将所以句子汇集起来的一个集合就是语言。我们要想了解“语言”要表达的信息,我们就必须定义相应的语法规则。这样,书写者就可以根据语法规则来书写“句子”,阅读者根据语法规则来阅读“句子”,这样才能做到信息的正确传递。而本文讲到的解释器模式,其实就是用来实现根据语法规则解读“句子”的解释器。
可以说的再具体一些:在软件开发中,我们可能会遇到有些问题多次重复出现而且有一定的相似性和规律性的情况。那么如果我们将这些情况归纳成一种简单的语言,那么每一种情况都是组成该语言的一个句子。其实在我们日常开发的过程中,真正需要使用解释器模式的场景并不多,所以本节内容只需要简单了解一下就好啦~ 不过话说回来了,虽然使用解释器模式的实例不是很多,但对于满足以上特点,且对运行效率要求不是很高的应用实例,如果用解释器模式来实现,其效果是非常好的。
解释器模式的实现创建解释器接口类
public interface Expression {
public boolean interpret(String context);
}
实现解释器接口
class TerminalExpression implements Expression {
private String data;
public TerminalExpression(String data){
this.data = data;
}
@Override
public boolean interpret(String context) {
if(context.contains(data)){
return true;
}
return false;
}
}
class OrExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public OrExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) || expr2.interpret(context);
}
}
class AndExpression implements Expression {
private Expression expr1 = null;
private Expression expr2 = null;
public AndExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public boolean interpret(String context) {
return expr1.interpret(context) && expr2.interpret(context);
}
}
创建规则并进行解释
public class Test {
public static Expression getMaleExpression(){
Expression robert = new TerminalExpression("张三");
Expression john = new TerminalExpression("李四");
return new OrExpression(robert, john);
}
public static Expression getDriverExpression(){
Expression julie = new TerminalExpression("小王");
Expression married = new TerminalExpression("司机");
return new AndExpression(julie, married);
}
public static void main(String[] args) {
Expression isMale = getMaleExpression();
Expression isDriver = getDriverExpression();
System.out.println("张三是男生吗? " + isMale.interpret("张三"));
System.out.println("王五是男生吗? " + isMale.interpret("王五"));
System.out.println("小王是司机吗? " + isDriver.interpret("小王是司机"));
System.out.println("小赵是司机吗? " + isDriver.interpret("小赵是厨师"));
}
}
运行结果
解释器模式的优点与缺点最后我们总结一下解释器模式的优点与缺点
优点
由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法,有良好的扩展性;同时在语法树中的每个表达式节点类都是相似的,所以实现其文法较为容易。
缺点
小结諾 在软件开发中,需要定义语言文法的应用实例非常少,所以这种模式很少被使用到;解释器模式中的每条规则至少需要定义一个类,当包含的文法规则很多时,类的个数将急剧增加,导致系统难以管理与维护。
本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨
希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●’◡’●)
如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。
你在被打击时,记起你的珍贵,抵抗恶意;
你在迷茫时,坚信你的珍贵,抛开蜚语;
爱你所爱 行你所行 听从你心 无问东西



