点击标题下「异步图书」可快速关注
什么是解释器模式
所谓解释器模式,就是先定义文法的一种表示,再定义一个解释器,该解释器使用该表示来解释语言中的句子的设计模式。解释器模式用处较少,很少有用户有定义Java语言文法的机会。
解释器模式的实现方式
JavaScript和Python都有eval(String string)函数,用于通过计算 string 得到的值(如果有的话),例如输入'3+6/(3-2)',输出9。但Java没有这个方法,我们可以用解释器模式造一个。带括号和乘除法的有点复杂,本文仅考虑加减法的情况。如果输入'1 + 2 - 3 + 4',输出4则为成功。
我们先定义一个抽象的解释器:
publicabstractclassExpression {
publicabstractintinterpret(); }
数字解释器:
publicclass NumExpression extends Expression {privateintnum;publicNumExpression(intnum) {this.num = num; }@Overridepublicintinterpret() {returnnum; } }
运算符解释器:
publicabstractclass OperatorExpression extends Expression {protectedExpression exp1,exp2;publicOperatorExpression(Expression exp1,Expression exp2){this.exp1 = exp1;this.exp2 = exp2; } }
加法解释器:
publicclass AddExpression extends OperatorExpression {publicAddExpression(Expression exp1, Expression exp2) {super(exp1, exp2); }@Overridepublicintinterpret() {returnexp1.interpret() + exp2.interpret(); } }
减法解释器:
publicclass SubExpression extends OperatorExpression {publicSubExpression(Expression exp1, Expression exp2) {super(exp1, exp2); }@Overridepublicintinterpret() {returnexp1.interpret() - exp2.interpret(); } }
造一个Calculator类处理与解释相关的业务:
publicclassCalculator {privateStack mExpStack =newStack();publicCalculator(String expression){//两个临时变量用于存储运算符两边的数字解释器Expression exp1,exp2;//偷个懒,用空格分割表达式字符串String[] elements = expression.split(" ");for(inti =0;i < elements.length;i++){switch(elements[i].charAt(0)){case'+': exp1 = mExpStack.pop(); exp2 =newNumExpression(Integer.valueOf(elements[++i])); mExpStack.push(newAddExpression(exp1,exp2));break;case'-': exp1 = mExpStack.pop(); exp2 =newNumExpression(Integer.valueOf(elements[++i])); mExpStack.push(newSubExpression(exp1,exp2));break;default: mExpStack.push(newNumExpression(Integer.valueOf(elements[i])));break; } } }publicintcalculate(){returnmExpStack.pop().interpret(); } }
看看效果如何
Log.e("Java中的eval",new Calculator("1 + 2 + 3 + 4").calculate() +"");
读者可以自己手动敲一下代码,看看能不能得到想要的结果。
Android源码中的解释器模式
(1)AndroidManifest是一个XML文件,也是每个Android程序员学习Android的历程中见到的第一个文件。PackageParser是解析这个XML文件的类,这个类为AndroidManifest中每个标签(Activity、Service、Provider、Permission等等)都创建了对应的解释器。
(2)无独有偶,Android系统用来安装Apk的服务PackageManagerService也是用解释器模式来遍历Apk中的目录和文件的。
Android开发中如何利用解释器模式
(1)解释器模式的优点在于其灵活的扩展性,我们只需要增加相应的解释器,就可以对文法规则进行拓展延伸。因此我们可以利用解释器模式仿照TextUtils写一个自己的工具类。
需要注意的几个问题
(1)解释器模式对每一条文法都至少生成一个解释器,造成后期维护困难。
(2)过于复杂的文法可能会出现不得不构建多颗抽象语法树的情况,因此不推荐对复杂的文法使用解释器模式。
长期福利
规则:1.将【异步图书】公众号推荐给你的朋友,并转发本文
2.关注【异步图书】大于等于10个人且关注时间超过10天
3.将朋友微信昵称或者截图发送至异步图书后台
4.经小编确认后,会赠出任意100元以下“异步图书”一本
5.本活动长期有效,每个读者限领取一次。
6.参与活动的读者需要在好友关注 “异步图书”10天后将昵称发给小编确认
延伸推荐
点击关键词阅读更多新书: