一.设计模式六大原则
1.单一职责原则:一个类应该只有一个引起它变化的原因
2.开放封闭原则:对类、模块、方法的修改是封闭的,对类的扩展是开放的
3.里氏替换原则:对基类可以引用的地方都能透明的使用子类的对象
4.依赖倒置原则:高层模块不依赖底层模块,都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象
5.迪米特原则:最少知识原则,一个软件实体应该尽量少的和其他实体发生相互作用
6.接口隔离原则:一个类对另一个类的依赖应该建立在最小的接口上
二.设计模式分类
创建型设计模式,5种:单例模式,工厂方法模式,抽象工厂方法模式,建造者模式,原型模式。外加一种:对象池模式(不属于GoF中的模式)
结构型设计模式,7种:适配器模式,装饰模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
行为型设计模式,11种:策略模式,模块方法模式,观察者模式,迭代器模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,中介者模式,解释器模式。
三.创建型设计模式
1.单例模式:确保某一个类只有一个实例,并提供一个它的全局访问点。
①.单例模式的6种写法:
饿汉单例,懒汉单例(分线程不安全和安全),双重检查模式(DCL),静态内部类单例模式,枚举单例模式,使用容器HashMap实现单例模式
核心原理:构造方法私有化,并通过静态方法取得唯一实例。
②.android源码中的使用WindowManagerGlobal是线程安全的懒汉单例,LayoutInflater实例是使用容器HashMap实现单例,UniversalImageLoader是双重检查模式单例。
③.代码中的应用ConfigManager,IflyHelper饿汉单例,ApplicationLoader双重检查模式,SkinManager静态内部类单例。
④.使用场景:整个项目只有一个共享访问点或共享数据,创建对象需要耗费资源过多,工具类对象。
2.工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪个类
①.解析:在createProduct中根据传入的子类然后反射得到实例。
②.android源码中的用法:setContentView中可以设置不同的View,相当于工厂方法,模式如下:
Activity工厂类 子Activity工厂实现类 View产品类 子View产品实现类
③.实际运用:解析数据中通过工厂解析到不同子类,根据不同的focus解析到不同的处理类中。
3.抽象工厂模式:为创建一组相关或者相互依赖的对象提供接口。
相对于工厂模式:此处是创建一组接口,工厂模式是创建一个接口。
4.建造者模式:将一个复杂对象的构建过程和它的表示分离,使同样的构建过程有不同的表示。
①.解析:Director负责顺序,Builder负责构建
一般省略Director导演类,直接Builder中的方法返回自身,链式调用。
②.android源码中的用途:AlertDialog.Builder中的调用。OkHttp的request,Retrofit的retrofit等等。
四.结构型设计模式。
1.代理模式:为其他对象提供一种代理,以控制对这个对象的访问。
①.从编码角度代理分为两种:
静态代理模式:如上图,需要持有对真实主题类的引用。
动态代理模式:代理类实现InvocationHandler方法,不需要关系到底代理谁。
②.代理模式从适用类型中分为四类:远程代理,虚拟代理,安全代理,智能指引。
③.代理模式在android源码中的应用:ActivityManagerProxy代理ActivityManagerService。AMP是抽象主题类,AMS是真实主题类。Rretrofit的call创建过程也用到了代理模式。
2.装饰器模式:动态的给一些对象添加一些额外的职责。
①.分析装饰器模式构成:
角色:Component(抽象组件),ConcreteComponent(组件具体实现),Decorator(抽象装饰者),ConcreteDecorator(装饰者具体实现)
关系:抽象装饰者构造方法中引用抽象组件的具体实例,抽象装饰者继承抽象组件。
②.android源码中的装饰器模式:ContextWrapper是装饰者,ContextImpl是组件具体实现,Context是抽象组件。
3.外观模式:也称门面模式,要求子系统的外部与内部的通信必须通过一个统一的对象进行。
角色:外观类,子系统类。
android源码中实例:ContextImpl就是一个外观类,里面封装了很多操作。
4.享元模式:使用共享对象有效的支持大量的细粒度对象。
对象分为两个部分:内部状态和外部状态,内部状态是可以共享出来,不会随着环境变化而变化,外部状态是随着环境变化而变化的。
角色:享元工厂,抽象享元对象,具体享元对象。
主要实现:享元工厂有Map对象池,根据内部状态作为key,当内部状态相同的则会复用原先的实例。
五.行为型设计模式
1.策略模式:定义一系列算法,把每个算法封装起来,并且使它们可以相互替换。
角色:上下文角色,抽象策略类,具体策略类。
上下文角色有抽象策略类的引用,具体用什么策略在客户端实例化具体的策略类对象。
android源码中的使用:动画中的时间插值器(timeInterpolator)
2.模板方法模式:定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类不改变一个算法的结构即可重定义算法的某些特定步骤。
角色:抽象类,定义一套算法的框架 具体实现类
android源码中:AsyncTask中的步骤,Activity生命周期。
实践:BaseActivity的initView,initData,initLisenter
3.观察者模式:定义对象间一种一对多的依赖关系,每当一个对象改变时,则依赖于他的对象都会得到通知并自动更新。
角色:抽象主题类,具体主题类,抽象观察者,具体观察者。
Observer(抽象观察者)和Obserable(抽象主题类)是JDK内置类型。
android源码中:ListView的adapter的notifyDataSetChanged方法,在setAdapter时注册观察者。
广播接收器
实际运用:RecycleView的item点击事件。
4.桥接模式:将抽象部分与实现部分分离,使它们可以独立的进行变化。
角色:抽象部分,抽象的实现,实现接口,实现的实现
抽象部分含有对实现的引用。
android源码中:Window是抽象部分,PhoneWindow是抽象部分实现,WindowManager是实现部分,WindowManagerImpl是实现部分的实现。