经过一个多月的时间,终于将经典的23种设计模式结合 Android 源码学习了一遍,虽然这次集中学习设计模式的时间只有一个月不到,但是在之前,从第一次接触设计模式到看各种设计模式的书籍、看各种大牛的博客,已经一年有余。设计模式初看一般理解起来都不难,但是要把设计模式用好,学会却不容易,这也是有人说设计模式用出不大的原因。但是我却不是这样认为,我觉得要学好设计模式,学会设计模式,首先得熟悉设计模式,这是基础,只有打好了这个基础,无论是阅读 Android 源码还是阅读经典库的源码时才会有所收获,才能理解设计模式的好处。
在这一个多月的集中学习设计模式的过程中,我也将自己的收获都写成了博客。我博客中所涉及到的设计模式都是非常常用,非常重要的设计模式,但是并不是说没有涉及的设计模式不重要,大家一样要了解。下面集是涉及到设计模式的博客:
面向对象的六大原则
单例模式
设计模式之 Builder 模式
设计模式之策略模式
设计模式之命令模式
设计模式之观察者模式
设计模式之代理模式
设计模式之适配器模式
设计模式之桥接模式
利用责任链模式实现加载不同来源的数据
23 种设计模式汇总
设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
23种设计模式的关系可以用下图表示
23 种设计模式在 Android 源码中的应用
下面我们简要的介绍一下设计模式在 Android 源码中的应用
工厂方法模式: 接口 Iterable 中的 iterator 就是一个工厂方法, Activity 中的 onCreate 也可以看作是工厂方法
抽象工厂模式: MediaPlayerFactory 是一个抽象工厂
单例模式: 单例模式的应用非常广泛, Application 就是单例的, WindowManagerService 、 ActivityService 等系统级的 Service 也是单例的,具体可见 单例模式
建造者模式 :建造者模式在图片加载库中使用非常普遍,例如 Picasso 、 Glide 、UniversalImageLoader 中都有建造者模式的身影。在 Android 源码中 AlertDialog 中应用了建造者模式,详见 设计模式之 Builder 模式
原型模式:原型模式就是实现接口 Cloneable ,这个太多了。。。
适配器模式:这个不用说了, AbsListView 和 RecyclerView 都使用了适配器模式。详见:设计模式之适配器模式
装饰器模式:Context 、 ContextImpl 、 ContextWrapper 、ContextThemeWrapper
代理模式: AIDL ,ActivityProxy(其实这也是 AIDL )
外观模式:Context 作为 Android 系统中的上帝类,封装了很多功能,这也是外观模式的应用
桥接模式:Adapter 与 AdapterView 的桥接,Window 与 WindowManager 的桥接 详见:设计模式之桥接模式
组合模式: View 、 ViewGroup
享元模式:Message 中的 MessagePool 是用链表实现的。
策略模式:动画中的 InterPolator 和 TypeEvaluator 。详见Android 动画分析
模板方法模式: 模板模式的应用非常广泛, Android 中 AsyncTask 的几个回调可以看作模板。
观察者模式: AbsListView 和 RecyclerView 都使用了观察者模式,详见设计模式之观察者模式
迭代子模式: 这个不用说了,在 JDK 中的集合类都是迭代子模式。
责任链模式: View 中对于事件的分发处理可以看作是责任链模式。详见利用责任链模式实现加载不同来源的数据
命令模式: Android 事件的底层 NotifyArgs 就是一个命令对象。
备忘录模式: Android 的状态保存, onSaveInstanceState 、 onRestoreInstaceState
状态模式: WIFI 管理
访问者模式: Java 注解 APT
中介者模式: KeyGuard 功能的实现
解释器模式: PackageParser 中有解释器模式的影子
总结
其实在 Android 源码中的设计模式并不都是经典设计模式的样子,所以我们学习设计模式也不能死读书,而是要学习设计模式的思想,灵活方便的使用设计模式。