android源码解释器模式,【玖哥乱弹】设计模式与Android之解释器模式——Java也有eval...

点击标题下「异步图书」可快速关注

什么是解释器模式

所谓解释器模式,就是先定义文法的一种表示,再定义一个解释器,该解释器使用该表示来解释语言中的句子的设计模式。解释器模式用处较少,很少有用户有定义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天后将昵称发给小编确认

延伸推荐

点击关键词阅读更多新书:

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值