为什么网站建设要值班,食品包装,网站推广的主要方法有哪些?,付费软件免费拿阅读建议
嗨#xff0c;伙计#xff01;刷到这篇文章咱们就是有缘人#xff0c;在阅读这篇文章前我有一些建议#xff1a;
本篇文章大概5000多字#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强#xff0c;是一篇质量分数较高的技术干货文章#x…
阅读建议
嗨伙计刷到这篇文章咱们就是有缘人在阅读这篇文章前我有一些建议
本篇文章大概5000多字预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强是一篇质量分数较高的技术干货文章建议收藏起来方便时常学习与回顾温故而知新。创作不易免费的点赞、关注请走上一走算是对博主一些鼓励让我更有动力输出更多的干货内容。 什么是解释器模式 解释器模式Interpreter Pattern是一种行为型设计模式给分析对象定义一个语言并定义该语言的文法表示再设计一个解析器来解释语言中的句子。也就是说用编译语言的方式来分析应用中的实例其核心原理是将一个语言表达式表示为一个抽象语法树然后定义解释器来遍历这棵语法树并执行相应的操作。 是的没有看错这就是解释器模式的标准定义是不是和我一样看完后完全处于懵逼状态这里语言是什么文法又是什么语法树是什么解释器是怎么解释句子的...讲真的解释器模式确实不太好理解。 复杂的事情慢慢来理解先来弄懂标题解释器是什么意思 解释器Interpreter是一种电脑程序能够把高级编程语言一行一行直接转译运行。实际它是一种翻译程序执行方式是一边翻译一边执行。什么意思呢再具体来说比如JavaScript、Python就属于解释型语言如下面的python代码打印输出“hello world”在计算机里是怎么运行呢首先计算机能够理解并执行的指令是二进制的这些高级字符肯定是不直接执行的因此在执行前这句代码会通过python环境中的解释器解释成计算机可以理解的二进制指令如果语法有问题解释的过程就会出现异常程序执行会中断。而Java是属于编译型的什么意思呢就是先把.java文件编译成.class文件然后再加载到虚拟机执行。
print(Hello, world!)
找到标题的出处后后面的定义内容就好理解多了。
语言python就是一门编程语言汉语就是一门中国人之间直接交流的语言文法就是语法python有自己语法遵循语法规范程序才能正确解释并执行。汉语也有一般就是主谓宾那一套句子对于python来说print(Hello, world!)就一句话。对于汉语来说“我爱你中国”也是一个句子语法树语法树是句子结构的一种树型表示比如我爱你中国这句话照汉语的语法表示为一个树型结果就是 解释器模式有哪些核心角色 解释器模式的核心角色主要包括以下四个
抽象表达式(IExpression)这是解释器模式中的核心接口负责定义解释方法interpret交由具体子类进行具体解释。
/*** 抽象表达式*/
public abstract class AbstractExpression {public abstract boolean interpret(String info);
}终结符表达式(TerminalExpression)这是抽象表达式的子类实现了与文法中终结符相关的解释操作。通常一个解释器中只有一个终结符表达式但有多个实例对应不同的终结符。
/*** 终结符表达式*/
public class TerminalExpression extends AbstractExpression{private String data;public TerminalExpression(String data) {this.data data;}Overridepublic boolean interpret(String info) {return info.contains(data);}
}
非终结符表达式(NonterminalExpression)这也是抽象表达式的子类实现了文法中与非终结符相关的解释操作。
/*** 非终结符表达式*/
public class NonterminalExpression extends AbstractExpression {private AbstractExpression expr1;private AbstractExpression expr2;public NonterminalExpression(AbstractExpression expr1, AbstractExpression expr2) {this.expr1 expr1;this.expr2 expr2;}Overridepublic boolean interpret(String info) {return expr1.interpret(info) || expr2.interpret(info);}
}
上下文环境类(Context)这个类主要用来存放解释器之外的全局信息一般用来存放文法中各个终结符所对应的具体值。
/*** 上下文环境类*/
public class Context {private AbstractExpression expression;public Context(AbstractExpression expression) {this.expression expression;}public void interpret(String info){System.out.println(info);boolean interpret this.expression.interpret(info);if (interpret) {System.out.println(结束);}}
}
/*** 客户端*/
public class Client {public static void main(String[] args) {AbstractExpression expre1new TerminalExpression(\n);AbstractExpression expre2new TerminalExpression(\r);AbstractExpression exprenew NonterminalExpression(expre1,expre2);Context contextnew Context(expre);context.interpret(hello ,world!\n);}
}
解释器模式如何实现
需求描述 这篇文章是设计模式系列的最后一篇之所以放在最后一篇是因为我觉得理解起来比较困难和抽象。当然如果你能够跟上我的思路到这里也许已经明白其中的一二再举一个实际的例子来模拟解释器模式的实现看完之后也许就全明白了。 现在直播带货是真的火有的主播随随便便一场直播就够普通打工人干一辈子的了也正因此无数人开始蜂拥而入更有很多人为了圈钱更是没有底线的蹭热点、制造热点。人多了那么问题就出现了在直播间里有的人比较喜欢这个主播则是“我爱你xxx”、“xxx我支持你”之类的各种弹幕满屏飞有的人不喜欢这个主播则是各种诋毁和谩骂那么如果需要对所有要输出打印到公屏上的弹幕做一个敏感词的过滤应该怎么做呢如果使用解释器模式则可以这样实现
实现方法 1、AbstractExpression.java声明一个抽象表达式(IExpression)在抽象类里定义解释方法interpret由具体敏感词表达式、非敏感词表达工子类进行具体实现。
/*** 抽象表达式*/
public abstract class AbstractExpression {public abstract boolean interpret(String info);
}
2、SensitiveExpression.java、NonsensitiveExpresson.java声明具体的敏感词表达式类、非敏感词表达式类实现具体的解释逻辑
/*** 敏感词表达式*/
public class SensitiveExpression extends AbstractExpression {private String data;public SensitiveExpression(String data) {this.data data;}Overridepublic boolean interpret(String info) {return info.contains(data);}
}
/*** 非敏感词表达式*/
public class NonsensitiveExpression extends AbstractExpression {private AbstractExpression expr1;private AbstractExpression expr2;public NonsensitiveExpression(AbstractExpression expr1, AbstractExpression expr2) {this.expr1 expr1;this.expr2 expr2;}Overridepublic boolean interpret(String info) {return expr1.interpret(info) || expr2.interpret(info);}
}
3、Context.java上下文环境类(Context)持有具体的表达式实现。
/*** 上下文环境类*/
public class Context {private AbstractExpression expression;public Context(AbstractExpression expression) {this.expression expression;}public void print(String info) {boolean interpret this.expression.interpret(info);if (interpret) {System.out.println(忽略敏感词:*****);} else {System.out.println(XXXX说info);}}
}4、编写业务客户端进行测试验证
/*** 客户端*/
public class Client {public static void main(String[] args) {AbstractExpression expre1new SensitiveExpression(滚);AbstractExpression expre2new SensitiveExpression(垃圾);AbstractExpression exprenew NonsensitiveExpression(expre1,expre2);Context contextnew Context(expre);context.print(支持主播);context.print(主播垃圾);context.print(主播真漂亮);context.print(主播滚蛋);}
} 解释器模式适用哪些场景
解释器模式的应用场景包括但不限于以下几种情况
表达式求值例如计算器应用、公式计算、数据分析等解释器可以将表达式解析成计算机可以执行的指令。自然语言处理例如语言翻译、语音识别、虚拟助手等解释器可以将人类语言翻译成计算机可以识别的语言。日志处理使用脚本语言或编程语言处理日志时有很多服务会产生大量的日志需要对日志进行解析生成报表。各个服务的日志格式不同数据中的要素相同这种情况下通过程序解决上述问题主要的解决方案就是使用解释器模式。
解释器模式的优点和缺点
优点
易于改变和扩展文法由于在解释器模式中使用类来表示语言的文法规则因此可以通过继承等机制来改变或扩展文法。每一条文法规则都可以表示为一个类因此可以方便地实现一个简单的语言。增加新的解释表达式较为方便如果用户需要增加新的解释表达式只需要对应增加一个新的终结符表达式或非终结符表达式类原有表达式类代码无须修改符合“开闭原则”。
缺点
对于复杂文法难以维护在解释器模式中每一条规则至少需要定义一个类因此如果一个语言包含太多文法规则类的个数将会急剧增加导致系统难以管理和维护。执行效率较低由于在解释器模式中使用了大量的循环和递归调用因此在解释较为复杂的句子时其速度很慢而且代码的调试过程也比较麻烦。
总结
总之在表达式求值、自然语言处理和日志处理等业务场景中解释器模式可以将人类语言或非编程语言转换为计算机可执行的语言从而实现对数据的解析、处理和计算等功能是一种行之有效的设计模式但是其本身复杂性和核心原理需要特别注意。