android 设计模式总结

    xiaoxiao2022-07-02  104

    一.设计模式六大原则

    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是实现部分的实现。

     

     

     

     

     

     

     

    最新回复(0)