一.设计模式六大原则 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.抽象工厂模式:为创建一组相关或者相互依赖的对象提供接口。
相对于工厂模式:此处是创建一组接口,工厂模式是创建一个接口。
简单工厂模式、工厂模式、抽象工厂模式示例参考:简单工厂模式&工厂方法模式&抽象工厂模式的区别 - sunweiye - 博客园
4.建造者模式:将一个复杂对象的构建过程和它的表示分离,使同样的构建过程有不同的表示。
①.解析:Director负责顺序,Builder负责构建
一般省略Director导演类,直接Builder中的方法返回自身,链式调用。
②.android源码中的用途:AlertDialog.Builder中的调用。OkHttp的request,Retrofit的retrofit等等。
③.出端sdk中的Client参数设置。
④.建造者设计模式的两个必要条件:构建参数>5 & 参数可选
5.原型模式:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
①.解析:将实现Cloneable的类的对象通过clone方法实现对对象的拷贝。
②.浅拷贝和深拷贝:
浅拷贝只拷贝了需要克隆的对象但是克隆对象中的引用参数类型指向的还是同一地址,在克隆对象中对引用参数没有重新构建对象而用原来的对象就会影响原本的对象中的参数。
深拷贝是拷贝了需要克隆的对象并且拷贝对象中的引用参数的对象,这样在克隆对象中对引用参数即是不重新构建也不会对原先对象产生影响。
注意:String是引用类型,但是String是final类型,每次修改String内容都会重新创建新的对象,故String不需要进行深拷贝。StringBuffer和StringBuilder需要进行深拷贝,因为引用地址不变的情况下调用append方法会修改原先对象中StringBuffer或者StringBuilder的值。
四.结构型设计模式。 1.代理模式:为其他对象提供一种代理,以控制对这个对象的访问。
①.从编码角度代理分为两种:
静态代理模式:如上图,需要持有对真实主题类的引用。
动态代理模式:通过Proxy.newProxyInstance方法生成代理类,方法中第三个参数是实现InvocationHandler类,不需要关系到底代理谁。
②.代理模式从适用类型中分为四类:远程代理,虚拟代理,安全代理,智能指引。
③.代理模式在android源码中的应用:ActivityManagerProxy代理ActivityManagerService。AMP是抽象主题类,AMS是真实主题类。Rretrofit的call创建过程也用到了动态代理模式。
2.装饰器模式:动态的给一些对象添加一些额外的职责。
①.分析装饰器模式构成:
角色:Component(抽象组件),ConcreteComponent(组件具体实现),Decorator(抽象装饰者),ConcreteDecorator(装饰者具体实现)
关系:抽象装饰者构造方法中引用抽象组件的具体实例,抽象装饰者继承抽象组件。
②.android源码中的装饰器模式:ContextWrapper是装饰者,ContextImpl是组件具体实现,Context是抽象组件。
3.外观模式:也称门面模式,要求子系统的外部与内部的通信必须通过一个统一的对象进行。
角色:外观类,子系统类。
android源码中实例:ContextImpl就是一个外观类,里面封装了很多操作。
4.享元模式:使用共享对象有效的支持大量的细粒度对象。
对象分为两个部分:内部状态和外部状态,内部状态是可以共享出来,不会随着环境变化而变化,外部状态是随着环境变化而变化的。
角色:享元工厂,抽象享元对象,具体享元对象。
主要实现:享元工厂有Map对象池,根据内部状态作为key,当内部状态相同的则会复用原先的实例。
5.适配器模式:将一个类的接口变换成客户端所期待的另一种接口,从而是原本因接口不匹配而无法在工作的两个类能够在一起工作。
角色:目标角色,需要适配的类,适配器角色。
主要实现:
类适配器模式:适配器角色继承需要适配和实现目标角色接口,然后进行适配实现目标角色方法
对象适配器模式:适配器角色实现目标角色接口并持有需要适配类的实例,然后进行适配实现目标角色方法。
android源码中的适配器模式:listview和recycleview的adapter类进行适配getView方法输出格式统一的view。
五.行为型设计模式 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是实现部分的实现。
5.责任链模式:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连接成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
职责链模式存在以下两种情况。
纯的职责链模式:一个请求必须被某一个处理者对象所接收,且一个具体处理者对某个请求的处理只能采用以下两种行为之一:自己处理(承担责任);把责任推给下家处理。 不纯的职责链模式:允许出现某一个具体处理者对象在承担了请求的一部分责任后又将剩余的责任传给下家的情况,且一个请求可以最终不被任何接收端对象所接收。 android源码中:事件分发机制(纯责任链模式)、okhttp中拦截器(不纯责任链模式)
android应用中:一个请求发过来由各个环节处理(不纯的责任链模式) ————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/gongjdde/article/details/90441258