Android进阶知识(五):常用的7种设计模式简单介绍

Android进阶知识(五):常用的7种设计模式简单介绍

一、面向对象的六大原则

  1. 单一职责原则
    将一组相关性很高的函数、数据封装到一个类中。换句话说,一个类应该有单一的职责
  2. 开闭原则
    一个类应该对于扩展是开放的,但是对于修改是封闭的
  3. 里氏替换原则
    里氏替换原则的定义为:所有引用基类的地方必须能透明地使用其子类对象。本质上就是说,要好好利用继承和多态,以父类的形式声明的变量(或形参),赋值为任何继承于这个父类的子类后不影响程序的执行。
    在抽象类设计的时候就运用到了里氏替换原则。
  4. 依赖倒置原则
    依赖倒置原则主要是实现解耦,使得高层次的模块不依赖于低层次模块的具体实现细节。
    关键点:
    ① 高层模块不应该依赖底层模块具体实现,二者应该依赖其抽象类或接口;
    ② 抽象不应该依赖细节;
    ③ 细节应该依赖于抽象;
  5. 接口隔离原则
    接口隔离原则的定义:类之间的依赖关系应该建立在最小的接口上。其原则是将非常庞大的、臃肿的接口拆分成更小的更具体的接口。
  6. 迪米特原则
    一个对象应该对其他的对象有最少的了解

二、设计模式

  1. 单例模式
    定义:确保单例类只有一个实例,并且这个单例类提供一个函数接口让其他类获取到这个唯一的实例
    最简单的单例模式如下:
    Android进阶知识(五):常用的7种设计模式简单介绍
    上述单例模式在单线程下没有问题,但是在多线程的情况下就会出现问题,具体解决方案可以观看:设计模式(二):单例模式的七种写法
  2. Builder模式(创建者模式)
    创建者模式定义:将一个复杂对象的构造与它的表示分离,使得同样的构造过程可以创建不同的表示。
    Builder模式的用途:主要是在创建某个对象时,需要设定很多的参数(通过setter方法),但是这些参数必须按照某个顺序设定,或者是设置步骤不同会得到不同结果。
    举个非常简单的栗子:
    Android进阶知识(五):常用的7种设计模式简单介绍
    在上述的栗子中,如果先调用了setNum,则会出现错误,使用Builder模式可以很好解决这个问题,如下所示:

Android进阶知识(五):常用的7种设计模式简单介绍
注意到,Builder类的setter函数都会返回自身的引用this,这主要是用于链式调用,这也是Builder设计模式中的一个明显的特征
3. 观察者模式
观察者模式面向的需求是:A对象(观察者)对B对象(被观察者)的某种变化高度敏感,需要在B变化的一瞬间做出反应。
Android进阶知识(五):常用的7种设计模式简单介绍
新闻里喜闻乐见的警察抓小偷,警察需要在小偷伸手作案的时候实施抓捕。在这个例子中,警察是观察者,小偷是被观察者,警察需要时刻盯着小偷的一举一动,才能保证不会漏过任何瞬间。
程序的观察者模式中,观察者不需要时刻盯着被观察者,而是采用注册(Register)或者称为订阅(Subscribe)的方式,告诉被观察者:我需要你的某某状态,你要在它变化的时候通知我。
Android中的事件触发与监听就是一种观察者模式,如下图:
Android进阶知识(五):常用的7种设计模式简单介绍
4. 工厂方法模式
定义:定义一个创建对象的接口,让子类决定实例化哪个类。
Android进阶知识(五):常用的7种设计模式简单介绍
Android进阶知识(五):常用的7种设计模式简单介绍
5. 迭代器模式
定义:提供一种方法顺序访问一个容器对象中的各个元素,而不需要暴露该对象的内部表示。
例如Java中就有迭代器Iterator类,本质上说,它就是用迭代器模式。48
Android中最典型的就是Cursor用到了迭代器模式,当我们使用SQLiteDatabase的query方法时,返回的就是Cursor对象,通过如下方式去遍历:
Android进阶知识(五):常用的7种设计模式简单介绍
6. 适配器模式
定义:把一个类的接口变成客户端所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
在Android中,比较典型的有ListView和RecyclerView。ListView使用适配器主要是,ListView只关心它的每个itemView,而不关心这个itemView具体显示的内容。ListView和数据源之间没有任何关系,这时候需要适配器提供getView方法给ListView使用。
7. 原型模式
原型模式就是将一个对象进行拷贝。对于类A实例a,要对a进行拷贝,就是创建一个跟a一样的类型A的实例b,然后将a的属性全部复制到b。
需要注意深拷贝和浅拷贝。深拷贝就是把对象里面的引用的对象也要拷贝一份新的对象,并将这个新的引用对象作为拷贝的对象引用。
Android中运用原型模式的例子:
Android进阶知识(五):常用的7种设计模式简单介绍

参考资料:从Android代码中来记忆23种设计模式
给Android开发者的RxJava详解