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

单例模式

介绍

单例模式可谓是都会用到的一个设计模式。单例顾名思义只有一个实例。就像规定任何时候你只能有一个老婆或直接没有老婆一样(都是泪)。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

使用场景

  • 如果无法或者不想直接访问某个对象
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,783评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,396评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,834评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,036评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,035评论 5 362
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,242评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,727评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,376评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,415评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,463评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,140评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,734评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,809评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,028评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,521评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,119评论 2 341

推荐阅读更多精彩内容