版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android系统设计原则与设计模式Android系统设计原则与设计模式文章目录提到设计模式,大家并不陌生,我们之前在分析Android源码的时候也有提及,但都比较零散,不成系统。今天的这篇文章就来系统的总结—下23种设计模式的模式定义与实现方式,让读者有一个整体上的模式。什么是设计模式?令令通俗来讲,设计模式就是针对某一种特殊场景而给出的标准解决方案,它是前辈们的经验性总结,也是实现软件工程化的基础,良好的设计模式应用可以是我们的软件变得更加健壮可维护。设计模式按照类型划分可以分为三大类,如下所示:"创建型设计模式:如同它的名字那样,它是用来解耦对象的实例化过程。“结构型设计模式:将类和对象按照一定规则组合成一个更加强大的结构体。“行为型设计模式:定义类和对象的交互行为。23种设计模式划分如下图所示:令令注:23种设计模式很多小伙伴都烂熟于心,但是真正编程实践的时候未必会想的起来,这其实是一个潜移默化的过程,在看设计模式的时候,尽量多动手写一写,其中手写(不借助IDE)的效果最佳,可以加深理解,理解的深了,编程的时候自然就可以想的到去应用。一创建型设计模式创建型设计模式主要用来解耦对象的实例化过程,控制实例的生成。创建型设计模式一共有六种,如下所示:单1例模式模式定义当系统中只需要一个实例或者一个全局访问点的时候可以使用单例模式。"优点:节省系统创建对象的资源,提高了系统效率,提供了统一的访问入口,可以严格控制用户对该对象的访问。°缺点:只有一个对象,积累的职责过重,违背了单一职责原则。构造方法为private,无法继承,扩展性较差。单例模式的实现由很多种,如下所示:懒汉式单例双层校验锁单例容器单例静态内部类单例枚举单例其中静态内部类单例和枚举单例都是单例模式最佳的实现,但是出于便利性的考量,双层校验锁的实现应用的更为广泛,如下所示:publicclassDoubleCheckSingleton{//volatile关键字保证了:①instance实例对于所有线程都是可见的②禁止了instance//操作指令重排序。privatevolatilestaticDoubleCheckSingletoninstance;privateDoubleCheckSingleton。{}publicstaticDoubleCheckSingletongetInstance(){//第一次校验,防止不必要的同步。if(instance==null){//synchronized关键字加锁,保证每次只有一个线程执行对象初始化操作synchronized(DoubleCheckSingleton.class){//第二次校验,进行判空,如果为空则执行初始化if(instance==null){instance=newDoubleCheckSingleton。;}}}returninstance;}}关于双层校验锁单例为何能实现JVM单例,它的要点在于两次判空和synchronized、volatile关键字,具体原理已经写在上方的注释里,这里我们单独说一下volatile关键字。说明我们说到,volatile关键字禁止了instanee操作指令重排序,我们来解释一下,我们知道instanee=newDoubleCheckSingleton()这个操作在汇编指令里大致会做三件事情:给我们知道instanee分配内存。调用DoubleCheckSingleton()构造方法。3•将构造的对象赋值给instanee。但是在真正执行的时候,Java编译器是允许指令乱序执行的(编译优化),所以上述3步的顺序得不到保证,有可能是132,试想一下,如果线程A没有执行第2步,先执行了第3步,而恰在此时,线程B取走了instanee对象,在使用instanee对象时就会有问题,双层校验锁单例失败,而volatile关键字可以禁止指令重排序从而解决这个问题。单例模式的另一个问题就是多进程的情况下的失败问题,因为JVN里的单例是基于一个虚拟机进程的,这个时候通常的做法就是让这个单例支持跨进程调用,这个在Android里一般用AIDL实现。1.2建造者模式模式定义封装一个复杂对象的构建过程,可以按照流程来构建对象。“优点:它可以将一个复杂对象的构建与表示相分离,同一个构建过程,可以构成出不同的产品,简化了投建逻辑。“缺点:如果构建流程特别复杂,就是导致这个构建系统过于庞大,不利于控制。建造者模式的实现,也十分简单,如下所示:publicclassProduct{privateStringboard;privateStringdisplay;privateStringos;publicStringgetBoard(){returnboard;publicStringgetDisplay(){returndisplay;…){returnos;privateProduct(Builderbuilder){//进行构建this.board=builder.board;this.display=builder.display;this.os=builder.os;publicstaticclassBuilder{//建造者模式还可以设置默认值privateStringboard="defaultvalue";privateStringdisplay="defaultvalue"privateStringos="defaultvalue";publicvoidsetBoard(Stringboard){this.board=board;publicvoidsetDisplay(Stringdisplay){this.display=display;publicvoidsetOs(Stringos){this.os=os;(}}returnnewi1.3原型模式模式定义当某个对象的数据结构或者构建过程特别复杂,频繁的构建势必会消耗系统性能,这个时候我们采用原型模式对原有的对象进行克隆,构建新的对象。°优点:直接克隆原有实例生成新的实例,免去了复杂的构建过程,节省了系统资源。°缺点:实现原型模式也很简单,主需要声明实现Ioneable接口,然后覆写Object的clone()方法接口。原型模式要注意深拷贝和浅拷贝的问题,Object的clone()方法默认是钱拷贝,即对于引用对象拷贝的地址而不是值,所以要实现深拷贝,在clone()方法里对于引用对象也有调用一下clone()方法,并且引用对象也要实现Cloneable接口和覆写clone()方法。接下来我们继续看看三种工厂模式,如下所示:“简单工厂模式:根据传入的参数决定实例化哪个对象。“工厂模式:工厂模式定义了一个创建对象的接口,由子类进行对象的初始化,即工厂模式将子类的初始化推迟到了子类里。“抽象工厂模式:抽象工厂模式和工厂模式很相似,只是它利用接口或者抽象类定义了一个产品族,例如定义一个拨号产品族,只定义功能,不关心实现,具体实现交由Android、iOS等操作系统自己完成。1.4简单工厂模式模式定义根据传入的参数决定实例化哪个对象。简单工厂模式是工厂模式的简化版本,无需定义抽象工厂,通常还可以利用反射来生成对象,简化操作,如下所示://简单工厂publicclassSimpleFactory{publicstatic<TextendsAbstractProduct>Tcreate(Class<T>clasz){AbstractProductproduct=null;try{product=(AbstractProduct)Class.forName(clasz.getName()).newInstance();}catch(InstantiationExceptione){e.printStackTrace();}catch(IllegalAccessExceptione){e.printStackTrace();}catch(ClassNotFoundExceptione){e.printStackTrace();}return(T)product;}}"优点:“缺点:1.5工厂模式模式定义工厂模式定义了一个创建对象的接口,由子类进行对象的初始化,即工厂模式将子类的初始化推迟到了子类里。抽象工厂模式
“优点:工厂模式符合开闭原则,当需要增加一个新产品时,只需要增加一个具体产品类和一个具体工厂类,无需修改原有的系统,外界也无需知道具体的产品类的实现。。缺点:每次增加新产品的时候都会增加产品类和工厂类,势必会让系统越来越庞大。1.6抽象工厂模式模式定义抽象工厂模式和工厂模式很相似,只是它利用接口或者抽象类定义了一个产品族,例如定义一个拨号产品族,只定义功能,不关心实现,具体实现交由Android、iOS等操作系统自己完成。"优点:"缺点:实现如下所示://抽象产品ApublicabstractclassAbstractProductA{}//抽象产品BpublicabstractclassAbstractProductB{}//具体产品A1publicclassConcreteProductAIextendsAbstractProductA{}//具体产品A2publicclassConcreteProductA2extendsAbstractProductA{}//具体产品B1publicclassConcreteProductB1extendsAbstractProductB{}//具体产品B2publicclassConcreteProductB2extendsAbstractProductB{}//抽象工厂publicabstractclassAbstractFactory{publicabstractAbstractProductAcreateProductA();publicabstractAbstractProductBcreateProductB();}//具体工厂publicclassConcreteFactoryextendsAbstractFactory{@OverridepublicAbstractProductAcreateProductA(){returnnewConcreteProductA1();}@OverridepublicAbstractProductBcreateProductB(){returnnewConcreteProductB1();}}二组合型设计模式2.1适配器模式模式定义适配器模式可以将一个类的接口,转换成客户端期望的另一个接口,让两个原本不兼容的接口可以无缝对接。优点:"缺点:
组2合模式模式定义将对象组成树形结构以表示整体-部分的层次结构,使得用户对单个对象和组合对象的使用具有一致性。应用场景“表示对象部分-整体的层次结构。从一个整体中能够独立出部分模块或者功能的场景。2.装3饰模式模式定义动态的为对象增加一些额外的功能。应用场景°需要透明且动态的扩展类的功能时。应用场景应用场景应用场景应用场景//抽象组件类publicabstractclassAbstractcomponent{protectedabstractvoidoperation。;//具体组件类publicclassConcreteComponentextendsAbstractcomponent{@Override//抽象装饰类publicabstractclassAbstractDecoratorextendsAbstractComponent{privateAbstractComponentmComponent;publicAbstractDecorator(AbstractComponentcomponent){mComponent=component;@Overrideprotectedvoidoperation(){mComponent.operation();//具体装饰类publicclassConcreteDecoratorextendsAbstractDecorator{publicConcreteDecorator(AbstractComponentcomponent){super(component);@Overrideprotectedvoidoperation(){operationA();super.operation();operationB();}:喰void…{2.4外观模式模式定义要求一个字系统的外部与其内部的通信都通过一个统一的而对象进行。
“子系统在迭代的过程中可以会不断变化,甚至被替代掉,给一个统一的访问接口,避免子系统的改变影响到外部的调用者。“当需要构建层次结构型的系统时,为各层子系统提供访问的接口进行通信,避免直接产生依赖。//列表接口publicinterfaceList{voidadd();voidremove();//数组列表publicclassArrayListimplementsList{@Override@Override//链表列表publicclassLinkedListimplementsList{@Override@Override(:ublicvoidremove(){2.桥5接模式模式定义将抽象部分和实现部分相互分离,使它们可以独立变化。应用场景“如果一个系统需要在抽象部分和实现部分增加更多的灵活性,避免两种变化的时候相互影响。如果不希望使用继承而增加系统的复杂度,可以考虑使用桥接模式。“一个类存在两个独立变化的纬度,且这两个纬度都希望进行扩展。2.享6元模式模式定义使用共享对象可以有效的支持大量的细粒度对象。
'系统中存在着大量的相似对象。“细粒度的对象都具有较接近的外部状态,而且内部状态与外部环境无关。“需要缓冲池的场景。2.7代理模式模式定义为其他对象提供一个代理以提供对这个对象的访问。应用场景“当无法或者不想直接访问某个对象时,可以通过一个代理对象进行访问。代理模式按照代理类运行前是否存在还可以分为静态代理和动态代理,如下所示:动态代理应用场景应用场景应用场景应用场景//被代理接口,定义要实现的功能。publicinterfaceSubject{voidvisit();}//被代理类,完成实际的功能。publicclassConcreteSubjectimplementsSubject{@Overridepublicvoidvisit(){System.out.println("visit");}}//动态代理类,实现InvocationHandler接口。publicclassDynamicProxyimplementsInvocationHandler{privateSubjectmSubject;publicDynamicProxy(Subjectsubject){mSubject=subject;}@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println("函数执行前自定义操作');〃调用被代理类的方法时会调用该方法method.invoke(mSubject,args);System.out.println("函数执行后自定义操作');returnnull;}}publicclassClient{publicstaticvoidmain(String[]args){Subjectsubject=newConcreteSubject();DynamicProxyproxy=newDynamicProxy(subject);//动态生成代理类SubjectproxySubject=(Subject)Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(),subject.getClass().getInterfaces(),proxy);proxySubject.visit();}}三行为型设计模式3.1模板模式模式定义定义一个操作的算法框架,而将具体实现延迟到子类中进行,使得子类在不改变整体算法框架的基础上,可以自定义算法实现。模式定义模式定义“多个子类有公有的方法,并且逻辑基本相同时。“重要复杂的算法可以把核心算法设计为模板方法,具体细节则由子类实现“重构代码时,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。解2释器模式模式定义给定一个语音,定义它的文法的一种表示,并定义一个解释器。应用场景“如果某个简单的语音需要解释执行并且可以将该语言中的语句表示为一个抽象语法树时可以使用解释器模式。在某些特定领域不断出现的问题是,可以将该领域的问题转船为一种语法规则下的语句,然后构建解释器来解释该语句。3.策3略模式模式定义策略模式定义了一系列算法,并将算法封装起来可以互相替换,策略模式让算法与使用它的客户端解耦,可以独立变化。应用场景°针对同一类型的问题有多种处理方式,仅仅是具体的行为有差别时。。需要安全的封装多种同一类型的操作时。。出现同一抽象类的多个字类,而又需要使用if-else来选择子类时。策略模式的实现也非常简单,依赖于接口或者抽象类,如下所示://策略接口,定义功能。publicinterface[Strategy{voidmethod();//策略ApublicclassStrategyAimplementsIStrategy{@Override}„//策略BpublicclassStrategyBimplementsIStrategy{@Override状4态模式允许一个对象在内部状态改变时改变它的行为。应用场景。一个对象的行为取决于它的状态,并且它在运行时根据状态改变它的行为。°代码中包含大量与对象状态相关的判断语句。状态模式的核心是根据不同的状态对应不同的操作,如下所示://操作接口publicinterfaceTVState{voidnextChannel();voidlastChannel();//开机状态publicclassPowerOnStateimplementsTVState{@OverridepublicvoidnextChannel(){//nextchannel@OverridepublicvoidlastChannel(){//lastchannel//关机状态publicclassPowerOffChannelimplementsTVState{@OverridepublicvoidnextChannel(){//donothing@O皿publicvoidlastChannel(){//donothing3.5观察者模式模式定义定义对象间一对多的依赖关系,每当这个对象发生改变时,其他对象都能收到通知并更新自己。应用场景“关联行为场景“事件多级触发场景“跨系统的消息交换场景,例如消息队列,事件总线的处理机制。观察者模式的实现如下所示:模式定义模式定义//监听接口,通知被监听对象发生改变publicinterfaceListener{voidchange();//被监听者publicclassObservable{privateListenermListener;//设置监听器publicvoidsetListener(Listenerlistener){mListener=listener;_{//通知对象发生改变mListener.change();publicclassObserver{publicvoidsetup(){Observableobservable=newObservable();observable.setListenerfiewListener(){@Overridepublicvoidchange(){//TODO监听的对象发生改变});3.6备忘录模式模式定义在不破坏封装的前提下,保存一个对象的内部状态,并在该对象之外保存这个状态,以便可以将该对象恢复到保存时的状态。应用场景°需要保存某个对象在某一时刻的状态。。外界向访问对象的状态,但是又不想直接暴露接口给外部,这时候可以将对象状态保存下来,间接的暴露给外部。3.7中介者模式模式定义中介者模式定义了一系列对象间的交互方式,使得这些对象像话作用而又不耦合在一起。应用场景“当对象间有很多的交互操作,而且一个对象的行为依赖于其他对象时,可以利用中介者模式解决紧耦合的问题。.8命令模式模式定义模式定义模式定义模式定义模式定义模式定义将一个请求封装成一个对象,可以将不同的请求参数化,可以对请求就行排队、日志记录以及撤销等操作。应用场景0需要抽象待执行的动作,然后以参数的形式提供出来。0在不同的时刻,指定和排列请求。0需要支持撤销操作。“
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全生产履职奖惩制度
- 公司办公环境奖惩制度
- 工程技术员放线奖惩制度
- 从业人员考核奖惩制度
- 彩贵州文明行动奖惩制度
- 公务车辆驾驶员奖惩制度
- 客服接单奖惩制度范本
- 公司催款奖惩制度范本
- 医疗救治中心奖惩制度
- 伤害住院上报奖惩制度
- 外贸业务薪酬管理制度
- 2025年事业编制考试真题及答案完整版
- 2026湖南医药发展投资集团有限公司所属企业公开招聘72人 2026年第一季度笔试模拟试题及答案解析
- 2026统编版语文 16 要是你在野外迷了路 教学课件
- 成人肠内营养耐受不良识别与防治专家共识2026
- 零指数幂与负整数指数幂(教学课件)-华东师大版八年级数学下册
- 保安安全值守标准化培训:职责、流程与应急处置
- 中学学生宿舍管理制度
- 部编人教版六年级下册道德与法治全册教案(完整版)教学设计
- 2026年辅警考试题库及答案
- 收费站环境卫生检查制度
评论
0/150
提交评论