美文网首页
简记Android源码设计模式——第一篇

简记Android源码设计模式——第一篇

作者: 码码Master | 来源:发表于2017-11-27 21:44 被阅读0次

    单例模式

    介绍

    单例模式可谓是都会用到的一个设计模式。单例顾名思义只有一个实例。就像规定任何时候你只能有一个老婆或直接没有老婆一样(都是泪)。Android中的LayoutInflater则使用的单例来进行访问。

    UML

    link

    使用场景

    是在全局下,需要只有该类一个实例,避免产生多个对象消耗过多的资源,如访问IO或者数据库等资源的对象。这样访问该类中变量也是唯一的。

    正常情况下我们需要写线程安全的方式,避免多线程情况下还是创建了多个实例。

    工厂模式

    介绍

    创建型设计模式之一,工厂模式,如名一样,由工厂生产产品。用它则因其扩展性,这里的工厂是抽象的概念,产品也是。比如我需要不同味道的鸭脖,不同味道又对应不同生产线,用他们相似的地方来抽象进行管理则能加强扩展性。作为管理者只需要知道有生产线和生产出的鸭脖味道。至于是由麻辣味生产线生产麻辣鸭脖,还是原味生产线生产原味鸭脖,则由实际运行的生产线和鸭脖味道而定。List和Set与Collection就是一个工厂模式的体现。Android中Activity的onCreate则是相当于一共工厂方法的。

    UML

    image

    使用场景

    在创建复杂对象的时候就需要使用它了,如有多个相似的对象创建。new就能创建的不使用工厂来处理

    构建者模式

    介绍

    Builder模式可用于创建一个复杂对象。用户往往不知道内部情况,可以通过构建方法来精细控制构建过程。顾名思义,Build作为创建一个类的中介类,使用Builder的方法来设置要创建类中的各个需要的参数并进行构建对应的对象。Android中的AlterDialog就用到了此模式,另外像ImageLoader等也都用到了此模式。

    UML

    image

    这是通常实际的构建者使用方式,不是经典使用UML。

    使用场景

    需要创建一个比较复杂的类,参数多,且很多参数都有默认值的时候。

    策略模式

    介绍

    在执行某个功能的过程当中,因传入实际对象不同,最后达到的另外一种效果的目的。策略策略,则代表执行策略,换一个对象使用那么执行的策略则产生了变化,达到的效果则发生变化。此模式代表了高度可替换,也是一个加强了扩展性的模式。

    往往我们为达到不同效果,常常使用if-else来使用,这种硬编码如果算法多复杂,增加修改起来则变得容易犯错误且臃肿,就有了这个模式的诞生。Android中动画的插值器即用到了此模式

    UML

    image

    )

    由图即可知道,依赖的是接口(也可为抽象类)。通过在相同行为抽象的下有具体不同的实现策略,从而达到很好的扩展性。

    使用场景

    • 针对同一个问题有多种处理方式,仅仅具体行为有差别

    • 需要安全分装多种同一类型操作的时候

    • 出现同一抽象有多个子类又需要使用if-else来选择具体子类的时候

    状态模式

    介绍

    状态模式和策略模式有相似之处,看的角度不同则就成了另外一种模式。比如遥控器遥控电视,开电源和关电源带两个状态,其中带来也各个操作响应不同。如果你看在电源的角度,则就是状态模式,如果你是在执行行为角度,则就可以说是一个策略模式。当然还是各有各的使用场景,状态模式是平行不可替换的。策略模式是平行独立可替换的。意图在一个对象内部状态改变的时候,其行为也跟着改变。Android中的Wifi的使用就用到了此模式

    UML

    image

    使用场景

    • 类行为取决于它的一个状态,且必须在运行时根据状态改变它的行为。

    • 代码中包含大量if-else,switch-case这样的结构且这些分之依赖于对象的状态。

    观察者模式

    介绍

    目前正火的Rx系列则是将此模式发挥得淋漓尽致。该模式使用率非常高。常用GUI系统,订阅发布等,这个模式重要作用就是解偶。常常使用传入listener接口做监听就是一个观察者的体现。书中说到定义对象间一对多的依赖关系,当对象状态改变的时候,所有依赖它的对象都会得到通知并自动更新。其值这就发布订阅关系,观察者和被观察者关系。Android每个人都会用到的Adapter则用到了该模式了

    UML

    image

    使用场景

    • 关联行为场景,关联行为可拆分,非聚合关系

    • 事件多级触发场景

    • 跨系统消息交换,如消息队列、事件总线的处理机制

    原型模式

    介绍

    原型模式是一个创建型模式,用于创建复杂的或者构造耗时的实例。其实现方式则是使用“克隆”,复制一个已存在的实例可以提高运行效率嘛,被复制的对象就被称为原型。通常我们使用实现Cloneable接口调用clone来实现拷贝(不一定非要实现),再结合深拷贝和浅拷贝进行处理。在Android中Intent有使用到此模式

    注意:拷贝不一定比new快,所以需要评估测试再考虑是否不用new

    UML

    image

    使用场景

    • 类初始化消耗资源大,包括数据,硬件等资源,通过原型的拷贝避免这些消耗

    • new对象的时候,要非常复杂的准备和或者访问权限等

    • 一个对象需要提供给多个对象文芳,各个调用对象都可能改变其值,这里就需考虑用原型模式做保护性拷贝。

    责任链模式

    介绍

    责任链模式是行为型设计模式之一。链则代表链式调用,采用链式调用方式,让调用者和处理者解偶。比如android中的有序广播,谁处理了后调用abortBroadcast()就可以终止了。不用说Android中的有序广播就用到了此模式了

    UML

    image

    使用场景

    • 多个对象都可以处理同一个请求,但是由哪个对象处理在运行时决定

    • 请求处理这不明确的情况下向多个对象中的一个提交请求

    • 需要动态指定一组对象处理请求

    代理模式

    介绍

    代理代理,就是找个中间人来做代理处理某件事。不过读了该书后感觉挺坑的,说好的代理,只是暴露出相对客户端来说,实际执行的,还是直接人,泪奔。不过它的目的不是帮你执行,而是代理控制对象的访问。这个模式是个编程好帮手,使用时候多多的,Android源码中,我们一直都有接触到到AMS的使用就用到了代理模式

    UML

    image

    使用场景

    • 如果无法或者不想直接访问某个对象

    相关文章

      网友评论

          本文标题:简记Android源码设计模式——第一篇

          本文链接:https://www.haomeiwen.com/subject/haljbxtx.html