解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。
该模式涉及角色如下:
1)抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()
方法,称做解释操作。
2)终结符表达式(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()
方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
3)非终结符表达式(Nonterminal Expression)角色:文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+"就是非终结符,解析“+”的解释器就是一个非终结符表达式。
4)环境(Context)角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。
1、实体类Context,具体代码如下:
package com.yoodb; public class Context { private Integer numo; private Integer numt; public Context(Integer numo, Integer numt) { this.numo = numo; this.numt = numt; } public Integer getNumo() { return numo; } public void setNumo(Integer numo) { this.numo = numo; } public Integer getNumt() { return numt; } public void setNumt(Integer numt) { this.numt = numt; } }
2、一个接口,具体代码如下:
package com.yoodb; public interface Expression { public int interpret(Context context); }
3、两个接口实现类,一个类是参数相加,一个类是参数相减,具体代码如下:
package com.yoodb; public class Minus implements Expression { @Override public int interpret(Context context) { // TODO Auto-generated method stub return context.getNumo()-context.getNumt(); } } package com.yoodb; public class Plus implements Expression { @Override public int interpret(Context context) { // TODO Auto-generated method stub return context.getNumo() + context.getNumt(); } }
4、单元测试,具体代码如下:
package com.yoodb; public class MainTest { public static void main(String[] args) { int result = new Minus().interpret((new Context(new Plus().interpret(new Context(2015, 8)), 4))); System.out.println(result); } }
运行结果如下:
2019
优点:解释器模式提供了一个简单的方式来执行语法,而且容易修改或者扩展语法。一般系统中很多类使用相似的语法,可以使用一个解释器来代替为每一个规则实现一个解释器。而且在解释器中不同的规则是由不同的类来实现的,这样使得添加一个新的语法规则变得简单。
关注下方微信公众号“Java精选”(w_z90110),回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。
本站文章除注明转载外,均由 素文宅 整理发布,欢迎任何形式的转载,但请务必注明出处。
转载请注明:文章转载自 素文宅博客 [https://blog.yoodb.com/]
本文标题:Java 设计模式之解释器模式
分享:
支付宝
微信