当前位置:主页 > 技术文章 >

技术文章

Technical articles

android源码中使用的设计模式(行为型——解释器模式,下令模式)

时间:2022-10-28 00:44 点击次数:
  本文摘要:1.解释器模式(Interpreter 化繁为简的翻译器)1.1界说给定一个语言,界说它的文法的一种表现,并界说一个解释器,该解释器使用该表现来解释语言中的句子。

华体会体育app

1.解释器模式(Interpreter 化繁为简的翻译器)1.1界说给定一个语言,界说它的文法的一种表现,并界说一个解释器,该解释器使用该表现来解释语言中的句子。解释器模式1.2使用场景语言需要解释,而且该语言中的语句备用表现成一个抽象的语法树在某些特定领域泛起不停重复的问题时,可以将该领域的问题转化成为一种语法例则下的语句,然后构建解释器来解释该语句1.3实现方法1.提取解释器配合点public abstract class ArithmeticExpreesion { /** * 抽象的剖析方法 * 详细的剖析逻辑由详细的子类实现 * */ public abstract int interpret();}2.解释器详细实现类public class NumExpression extends ArithmeticExpreesion { private int num; public NumExpression(int num) { this.num = num; } @Override public int interpret() { return num; }}//抽象运算符public abstract class OperatorExpression extends ArithmeticExpreesion { // 声明成员变量存储运算符双方的数字解释器 protected ArithmeticExpreesion exp1,exp2; public OperatorExpression(ArithmeticExpreesion exp1,ArithmeticExpreesion exp2){ this.exp1 = exp1; this.exp2 = exp2; }}//详细实现运算符public class AdditionExpression extends OperatorExpression { public AdditionExpression(ArithmeticExpreesion exp1, ArithmeticExpreesion exp2) { super(exp1, exp2); } @Override public int interpret() { return exp1.interpret() + exp2.interpret(); }}public class SubtractionExpression extends OperatorExpression { public SubtractionExpression(ArithmeticExpreesion exp1, ArithmeticExpreesion exp2) { super(exp1, exp2); } @Override public int interpret() { return exp1.interpret() - exp2.interpret(); }}3.业务处置惩罚public class Calculator { // 声明两个ArithmeticExpression栈存储并操作所有相关的解释器 private Stack<ArithmeticExpreesion> mExpStack = new Stack<ArithmeticExpreesion>(); public Calculator(String expression){ ArithmeticExpreesion exp1,exp2; String[] elements = expression.split(" "); for (int i = 0; i < elements.length; i++) { char key = elements[i].charAt(0); switch (key) { case '+': //将栈中的解释器弹出作为运算符号的左边的解释器 exp1 = mExpStack.pop(); // 同时将运算符符号数组下一个元素结构为一个数字解释器 exp2 = new NumExpression(Integer.valueOf(elements[++i])); mExpStack.push(new AdditionExpression(exp1, exp2)); break; case '-': //将栈中的解释器弹出作为运算符号的左边的解释器 exp1 = mExpStack.pop(); // 同时将运算符符号数组下一个元素结构为一个数字解释器 exp2 = new NumExpression(Integer.valueOf(elements[++i])); mExpStack.push(new SubtractionExpression(exp1, exp2)); break; default: mExpStack.push(new NumExpression(Integer.valueOf(elements[i]))); break; } } } public int calculate(){ return mExpStack.pop().interpret(); }}4.挪用public class Client { public static void main(String[] args) { String exp = "1 + 2 + 4 + 5 - 100"; Calculator c = new Calculator(exp); System.out.println(exp + " = " + c.calculate()); }}PS:在语法分析或者词义分析中会用到将一个详细的文法通过一个解释器解释, 把庞大的文法例则分散为简朴的功效举行解释, 最后将其组合成一颗抽象的语法树解释执行, 至此, 可以看到解释器模式的原理和本质: 将庞大的问题简朴化, 模块化, 分散实现, 解释执行1.4 android源码对应实现最典型的是对设置文件AndroidManifest.xml文件的剖析PackageParserPackageParser类为 Activity,service,provider等构件在其内部建立了对应的类,这个类其实对应设置文件中的一个个标签,也就是一条文法。Android中,某个apk文件的剖析会用到PackageManagerService的scanPackageLI()方法,这是一个重载方法,在剖析某个文件先挪用第一种实现剖析apk文件,再挪用第二种实现将剖析后的信息生存至PMSprivate PackageParser.Package scanPackageLI(File scanFile, int parseFlags, int scanFlags,long currentTime, UserHandle user);private PackageParser.Package scanPackageLI(PackageParser.Package pkg, int parseFlags,int scanFlags, long currentTime, UserHandle user)PMS2.下令模式2.1界说将一个请求封装成一个工具,从而让用户使用差别的请求把客户端参数化;对请求排队或者记载请求日志,以及支持可打消的操作。

下令模式2.2 说明Receiver是真正执行下令的工具。任何类都可能成为一个吸收者,只要它能够实现下令要求实现的相应功效。

Command下令角色:界说下令的接口,声明详细下令类需要执行的方法。这是一个抽象角色。concreteCommand:下令接口的详细实现工具,通常会持有吸收者,并挪用吸收者的功效来完成下令要执行的操作。Invoker请求者角色:卖力挪用下令工具执行请求,通常会持有下令工具(可以持有多个下令工具)。

Invoker是Client真正触发下令并要求下令执行相应操作的地方(使用下令工具的入口)。2.3使用场景需要抽象出待执行的行动,然后以参数的形式提出来,类似历程设计中的回调需要支持取消操作2.4代码实现1.吸收者/**** 吸收者角色*/public class TetrisMachine { public void toLeft(){ System.out.println("向左"); } public void toRight(){ System.out.println("向右"); } public void fastToButtom(){ System.out.println("快速向下"); } public void transform(){ System.out.println("改变形状"); }}2.抽象下令和详细下令/*** 下令者抽象*/public interface Command { /** * 下令执行方法 */ void execute();}public class LeftCommand implements Command { // 持有一个吸收者 private TetrisMachine machine; public LeftCommand(TetrisMachine machine) { this.machine = machine; } @Override public void execute() { machine.toLeft(); }}3.请求者public class Buttons { private LeftCommand leftCommand; private RightCommand rightCommand; private FallCommand fallCommand; private TransformCommand transformCommand; public void setLeftCommand(LeftCommand leftCommand) { this.leftCommand = leftCommand; } public void setRightCommand(RightCommand rightCommand) { this.rightCommand = rightCommand; } public void setFallCommand(FallCommand fallCommand) { this.fallCommand = fallCommand; } public void setTransformCommand(TransformCommand transformCommand) { this.transformCommand = transformCommand; } public void toLeft() { leftCommand.execute(); } public void toRight() { rightCommand.execute(); } public void fall() { fallCommand.execute(); } public void changer() { transformCommand.execute(); }}4.客户端挪用public class Player { public static void main(String[] args) { TetrisMachine machine = new TetrisMachine(); LeftCommand leftCommand = new LeftCommand(machine); RightCommand rightCommand =new RightCommand(machine); FallCommand fallCommand = new FallCommand(machine); TransformCommand transformCommand = new TransformCommand(machine); Buttons buttons = new Buttons(); buttons.setLeftCommand(leftCommand); buttons.setRightCommand(rightCommand); buttons.setFallCommand(fallCommand); buttons.setTransformCommand(transformCommand); buttons.toLeft(); buttons.toRight(); buttons.fall(); buttons.changer(); }}2.5 android源码中的实现android事件底层逻辑转发。


本文关键词:android,源码,中使,用的,设计模式,行为型,—,华体会体育

本文来源:华体会体育-www.mooncherrychina.com

Copyright © 2009-2022 www.mooncherrychina.com. 华体会体育科技 版权所有 备案号:ICP备66200305号-3

在线客服 联系方式 二维码

服务热线

0286-277780826

扫一扫,关注我们