当前位置: 首页 > news >正文

模仿网站建设手机网站根目录

模仿网站建设,手机网站根目录,上海知名装修公司排名榜,国家重大新闻前言Android的设计模式系列文章介绍#xff0c;欢迎关注#xff0c;持续更新中#xff1a;1.定义给定一门语言#xff0c;定义它的文法的一种表示#xff0c;并定义一个解释器#xff0c;该解释器使用该表示来解释语言中的句子。2.介绍解释器模式属于行为型模式。解释器模…前言Android的设计模式系列文章介绍欢迎关注持续更新中1.定义给定一门语言定义它的文法的一种表示并定义一个解释器该解释器使用该表示来解释语言中的句子。2.介绍解释器模式属于行为型模式。解释器模式提供了一种解释语言的语法或表达式的方式。解释器模式实际开发中很少用到。3.UML类图解释器模式UML类图.jpg角色说明AbstractExpression(抽象表达式)定义一个抽象的解释方法其具体的实现在各个具体的子类解释器中完成。TerminalExpression(终结符表达式)实现对文法中与终结符有关的解释操作。NonterminalExpression(非终结符表达式)实现对文法中的非终结符有关的解释操作。Context(环境角色)包含解释器之外的全部信息。Client(客户端角色)解析表达式构建抽象语法树执行具体的解释操作等。4.实现以加减法的实现为例我们实现下面表达式的解释并输出结果为了方便解释在表达式中介加了空格方便处理。a 1024b 512a ba - b4.1 创建抽象表达式public abstract class ArithmeticExpression {//抽象算术表达式public abstract Object interpret(Context context);//抽象解释方法}4.2 终结符表达式从上面的表达式可以看出终结符有两种一种是数字另外一种是变量。//数字表达式用来解释数字public class NumExpression extends ArithmeticExpression {private String strNum;public NumExpression(String strNum) {this.strNum strNum;}Overridepublic Integer interpret(Context context) {//解释数字return Integer.parseInt(strNum);}}//变量表达式用来解释变量class VarExpression extends ArithmeticExpression {private String var;public VarExpression(String var) {this.var var;}Overridepublic String interpret(Context context) {//解释变量return var;}}4.3 创建非终结符表达式上面的表达式有三种非终结符分别是号、-号和号。//加法表达式用来解释加法,如abpublic class AddExpression extends ArithmeticExpression {private ArithmeticExpression left, right;//加号左右两边的内容public AddExpression(ArithmeticExpression left, ArithmeticExpression right) {this.left left;this.right right;}Overridepublic Integer interpret(Context context) {//解释加法表达式的结果即算出leftright的结果return context.get((String) left.interpret(context)) context.get((String) right.interpret(context));}}//减法表达式用来解释减法,如a-bpublic class SubExpression extends ArithmeticExpression {private ArithmeticExpression left, right;//减号左右两边的内容public SubExpression(ArithmeticExpression left, ArithmeticExpression right) {this.left left;this.right right;}Overridepublic Integer interpret(Context context) {//解释减法表达式的结果即算出left-right的结果return context.get((String) left.interpret(context)) - context.get((String) right.interpret(context));}}//等号表达式用来解释变量赋值如a1024public class EqualExpression extends ArithmeticExpression {private ArithmeticExpression left, right;//等号左右两边的内容public EqualExpression(ArithmeticExpression left, ArithmeticExpression right) {this.left left;this.right right;}Overridepublic Object interpret(Context context) {//解释等号表达式的结果并将结果保存到context变量名为key,值为valuecontext.put((String) left.interpret(context), (int) right.interpret(context));return null;}}4.4 创建环境角色创建环境主要包含解释器之外的全部信息这里用来保存变量以及其值。public class Context {Map mMap new HashMap();//使用HashMap来保存结果public void put(String key, int value) {mMap.put(key, value);}public int get(String key) {return (int) mMap.get(key);}}4.5 创建客户端角色客户端角色主要负责解析表达式构建抽象语法树执行具体的解释操作等。public class Calculator {//计算器类Context mContext new Context();private ArithmeticExpression mExpression;public void read(String expression) {//读取表达式String[] split expression.split( );//表达式以空格隔开方便拆分switch (split[1]) {//根据不同符号去执行具体的解析操作case :new EqualExpression(new VarExpression(split[0]), new NumExpression(split[2])).interpret(mContext);break;case :mExpression new AddExpression(new VarExpression(split[0]), new VarExpression(split[2]));break;case -:mExpression new SubExpression(new VarExpression(split[0]), new VarExpression(split[2]));break;}}public int calculate() {//计算结果return (int) mExpression.interpret(mContext);}}4.6 客户端测试public void test() {Calculator calculator new Calculator();calculator.read(a 1024);//读取表达式calculator.read(b 512);System.out.println(a 1024);System.out.println(b 512);calculator.read(a b);System.out.println(a b calculator.calculate());//计算结果calculator.read(a - b);System.out.println(a - b calculator.calculate());}输出结果a 1024b 512a b 1536a - b 5125. 应用场景简单的语法需要解释时如解释一个sql语句。一些重复发生的问题比如加减乘除四则运算但是公式每次都不同有时是ab-cd有时是abc-d等公式千变万化但是都是由加减乘除四个非终结符来连接的这时我们就可以使用解释器模式。6. 优点灵活的扩展性想扩展语法规则时只需新增新的解释器就可以了。如上面的例子中想增加乘除法只想增加相应的解释类并增加相应的表达式解释操作即可。7. 缺点每一个文法都至少对应一个解释器会产生大量的类难于维护。解释器模式由于大量使用循环和递归需要考虑效率的问题而且调试也不方便。对于复杂的文法构建其抽象语法树会显得异常繁琐。所以不推荐在重要的模块中使用解释器模式维护困难。8. Android中的源码分析对于AndroidManifest.xml这个文件我们是相当熟悉。实际上AndroidManifest.xml是由PackageManagerService使用了PackageParser这个类来解释的这里面就用到了解释器模式。对于AndroidManifest.xml中的每一个标签都有对应的类去保存相应的信息。8.1 PackageParser的parseBaseApkCommon方法基于Android 27的源码不同版本的源码方法名可能不一样。private Package parseBaseApkCommon(Package pkg, Set acceptedTags, Resources res,XmlResourceParser parser, int flags, String[] outError)throws XmlPullParserException, IOException {//其他代码略if (tagName.equals(TAG_APPLICATION)) {//其他代码略if (!parseBaseApplication(pkg, res, parser, flags, outError)) {//解释application标签return null;}} else if (tagName.equals(TAG_OVERLAY)) {//其他代码略} else if (tagName.equals(TAG_KEY_SETS)) {if (!parseKeySets(pkg, res, parser, outError)) {return null;}} else if (tagName.equals(TAG_PERMISSION_GROUP)) {if (!parsePermissionGroup(pkg, flags, res, parser, outError)) {return null;}} else if (tagName.equals(TAG_PERMISSION)) {if (!parsePermission(pkg, res, parser, outError)) {return null;}} else if (tagName.equals(TAG_PERMISSION_TREE)) {if (!parsePermissionTree(pkg, res, parser, outError)) {return null;}} else if (tagName.equals(TAG_USES_PERMISSION)) {if (!parseUsesPermission(pkg, res, parser)) {return null;}} else if (tagName.equals(TAG_USES_PERMISSION_SDK_M)|| tagName.equals(TAG_USES_PERMISSION_SDK_23)) {if (!parseUsesPermission(pkg, res, parser)) {return null;}} else if (tagName.equals(TAG_USES_CONFIGURATION)) {//其他代码略} else if (tagName.equals(TAG_USES_FEATURE)) {//其他代码略} else if (tagName.equals(TAG_FEATURE_GROUP)) {//其他代码略} else if (tagName.equals(TAG_USES_SDK)) {//其他代码略} else if (tagName.equals(TAG_SUPPORT_SCREENS)) {//其他代码略} else if (tagName.equals(TAG_PROTECTED_BROADCAST)) {//其他代码略} else if (tagName.equals(TAG_INSTRUMENTATION)) {//其他代码略} else if (tagName.equals(TAG_ORIGINAL_PACKAGE)) {//其他代码略} else if (tagName.equals(TAG_ADOPT_PERMISSIONS)) {//其他代码略} else if (tagName.equals(TAG_USES_GL_TEXTURE)) {//其他代码略} else if (tagName.equals(TAG_COMPATIBLE_SCREENS)) {//其他代码略} else if (tagName.equals(TAG_SUPPORTS_INPUT)) {////其他代码略} else if (tagName.equals(TAG_EAT_COMMENT)) {//其他代码略} else if (tagName.equals(TAG_PACKAGE)) {//其他代码略} else if (tagName.equals(TAG_RESTRICT_UPDATE)) {//其他代码略} else if (RIGID_PARSER) {//其他代码略} else {//其他代码略}}从上面代码可以看到就是对各个标签的内容进行解释。我们再来看看parseBaseApplication这个方法这个是对Application进行解释。8.2 parseBaseApplication方法private boolean parseBaseApplication(Package owner, Resources res,XmlResourceParser parser, int flags, String[] outError)throws XmlPullParserException, IOException {//其他代码略String tagName parser.getName();if (tagName.equals(activity)) {//解释activityActivity a parseActivity(owner, res, parser, flags, outError, cachedArgs, false,owner.baseHardwareAccelerated);//其他代码略} else if (tagName.equals(receiver)) {//解释receiverActivity a parseActivity(owner, res, parser, flags, outError, cachedArgs,true, false);//其他代码略} else if (tagName.equals(service)) {//解释serviceService s parseService(owner, res, parser, flags, outError, cachedArgs);//其他代码略} else if (tagName.equals(provider)) {//解释providerProvider p parseProvider(owner, res, parser, flags, outError, cachedArgs);//其他代码略} else if (tagName.equals(activity-alias)) {Activity a parseActivityAlias(owner, res, parser, flags, outError, cachedArgs);//其他代码略} else if (parser.getName().equals(meta-data)) {//其他代码略} else if (tagName.equals(static-library)) {//其他代码略} else if (tagName.equals(library)) {//其他代码略} else if (tagName.equals(uses-static-library)) {if (!parseUsesStaticLibrary(owner, res, parser, outError)) {return false;}} else if (tagName.equals(uses-library)) {//其他代码略} else if (tagName.equals(uses-package)) {//其他代码略} else {//其他代码略}//其他代码略return true;}可以看到上面有对activity、receiver、service等标签的解释activity的具体解释在parseActivity这个方法里面有兴趣的可以自行去看下这里就不细说了同时可以看到receiver也是在parseActivity这个方法中解释。
http://wiki.neutronadmin.com/news/311616/

相关文章:

  • 音频文件放到网站空间里生成链接怎么做中国纪检监察报范耀庚
  • 二 网站建设的目的及功能定位郑州市中原区建设局网站
  • 做旅行社网站多少钱国内最新新闻摘抄2023年
  • 门户网站网站开发微指数查询
  • 网站建设修改教程视频教程dw怎样做网站切换
  • 什么叫做网站维护2345浏览器网页版入口官网
  • 国内网站设计案例欣赏自己做qq头像的网站
  • 网站关键词做的越多越好吗wordpress 打开空白
  • 青岛西海岸新区建设网站徐州市城乡建设局官方网站
  • 桐庐网站建设什么是功能型网站
  • 佛山市禅城网站建设vi设计公司排名前十强
  • 乌托邦网站建设网站区域名怎么注册
  • 网站建设方案模版wordpress 开源app
  • 东省住房和城乡建设厅网站小程序登录不上去怎么办
  • 沙田镇网站建设建设网站比较好公司
  • 夺宝网站建设贵阳网上注册公司流程
  • 上海网站工作室便捷的网站建设平台
  • 做搜狗手机网站优化排大连建设局网站
  • 电子商务网站的优点有那些找加工订单的网站
  • seo站长工具义乌网站制作
  • 南京网站建设公司大全建设一个网站报价
  • 网页设计与网站开发第三版课后答案wordpress修改语言
  • 海淘网站建设网站上线准备
  • 公司想建立一个网站吗网页代码小游戏
  • 网站视频弹窗代码外贸网站搭建推广
  • 做公司门户网站wordpress商用可以用吗
  • 网站建设了解一下图片做商城网站还要服务器
  • 网站404页面在哪查看1cpu0.5g服务器用来做网站
  • 广州做进口商品的网站什么叫网络架构
  • 国内做网站比较好的公司常州云计算网站建设