设计模式之解释器模式
#头条创作挑战赛#
今天说一个很少使用的设计模式--解释器模式。给定一个语言,定义它的文法表示,定义一个解释器,用解释器来解释句子中的含义。比如表达式中使用到的与或非。下面用程序展示这个模式是如何实现语义解释的。
第一,先看看各个类之间的关系图
第二,定义一个解释器接口Expression,三个实现类AndExpression,OrExpression,TerminalExpressionpublic interface Expression { public boolean interpret(String context); }/** * 与表达式 */ public 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 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); } }/** * 终端表达式 */ public 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; } }
第三,写一个测试程序InterpreterPatternDemopublic class InterpreterPatternDemo { //规则:Robert 和 John 是男性 public static Expression getMaleExpression(){ Expression robert = new TerminalExpression("Robert"); Expression john = new TerminalExpression("John"); return new OrExpression(robert, john); } //规则:Julie 是一个已婚的女性 public static Expression getMarriedWomanExpression(){ Expression julie = new TerminalExpression("Julie"); Expression married = new TerminalExpression("Married"); return new AndExpression(julie, married); } public static void main(String[] args) { Expression isMale = getMaleExpression(); Expression isMarriedWoman = getMarriedWomanExpression(); System.out.println("John is male? " + isMale.interpret("John")); System.out.println("Julie is a married women? " + isMarriedWoman.interpret("Married Julie")); } }
测试结果
这个模式优点:扩展性好,实现简单文法解释。缺点:使用的场景不多,采用了递归调用方法,实现复杂文法难维护。
好了,今天就到这里了,适合才是最好的,基础永不过时。
欢迎大家在评论区留言讨论,让更多的人看到你的观点。如果喜欢文章的话,请点赞关注转发分享出去!
枸杞配养生,解不了熬夜的伤枸杞配养生,也解不了熬夜的伤。熬最深的夜,喝最辣的酒,抽一根接一根的烟。再年轻的资本,也满足不了人心的欲。说着梦想成真,长命百岁,无欲无求。做的却是好吃懒做,娱乐随心,欲求不止。现
29岁辞职,3个月30个国家一次婚礼不过瘾,100次怎么样?欢迎转发到朋友圈钱钟书先生在围城中有这样一段话旅行最检验得出一个人的品行。旅行时最劳顿麻烦,叫人本性毕现。一场旅行,如果经历了各种分歧争吵和突发事件后,你还想和这个人在一起,那么你
9位女星整容上瘾,有人换头改命成一线,有人葬送事业无人问文阅栀编辑阅栀你的鼻子怎么了?你是整容了吗?哪里整容了,我这是微调!这组对话,来自刘嘉玲和梁家辉在电影中的一个情节。其实,整容这个话题早已是老生常谈,在娱乐圈更是见惯不怪。央视主持
看看影星李冰冰影星李冰冰说以后不会为生孩子的事而影响以后的生活,因为晚年想把家产留给两外甥和外甥女纯原创作品原创作17现在我们来说说影星李冰冰,时光过得好快,以前那个被我们熟知为是古装美女的李冰
以前五六千的手机都不眨眼,为什么现在发现三四千的手机也嫌贵?几年前,我们可以看到五六千旗舰机发售时,大家蹲点购买,现在会发现大家入手中端机也在纠结性价比,这是为什么呢?买对不买贵的原则智能手机已经普及多年,现在的人买手机已经不是追求价格,更
腾讯也救不活企鹅电竞,下一个无法体面离场的直播平台是谁4月7日,企鹅电竞发布公告称,由于业务发展策略的变更,企鹅电竞及相关产品,即将于2022年6月7日终止运营。目前,该平台已经停止新用户注册新主播及新公会入驻,并关闭了充值通道。并且
骁龙865小米手机迎来停更,两年的系统维护,官方做到了按照谷歌的要求,手机厂商在使用安卓系统的情况下,需要对智能手机进行两年的系统维护而市面上的骁龙865芯片手机大都发布两年以上的时间,手机厂商也进行了两年的系统维护,所以未来放弃对这
ROCWARERC08测评当国产摄像头开始内卷我们还是用手机视频聊吧,你电脑的画面太朦胧了。不同于手机摄像头军事竞赛般的快速升级,电脑的摄像头过得更像是一个小透明,不仅发布会鲜有提及,1080P画质的摄像头也仅出现在少数几款旗
华为芯片备胎转正三年记3月28日,华为公司副董事长CFO孟晚舟出席华为年报发布会,而她上次参加年报发布已经是四年前了。3月28日孟晚舟在华为21年度报告发布会2019年5月16日,华为被美国列入实体清单
面试官了解线程池吗?为什么有线程池?java语言里,针对每个请求都创建一个线程,会有很大开销。计算机在创建和销毁线程都需要花费额外的时间,甚至多于处理用户请求的时间。创建过多线程还会导致线程切换以及消
三一重工强势反弹盘中触及涨停只因一则传闻吗?月线图一三轻工强势反弹盘中触及涨停只因一则传闻吗?自2021年2月份以来,三一重工icon从高点50。3一路下滑,最低跌至今年3月16日的盘中16。2,连续13个月下滑,途中只有一