设计模式的目的只有一个,降低对象之间的耦合,增强程序的复用性、拓展性、维护性
设计模式一般分为三类:创建型模式、结构型模式、行为型模式
(口诀:单抽工建原)
用来创建对象的。一共有五种:单例模式、原型模式、建造者模式、工厂方法模式、抽象工厂模式、。
确保某一个类只有一个实例,并且提供一个全局访问点。
创建多个产品族中的产品对象。
定义:让子类来决定要创建哪个对象;适用于一系列、大批量的对象生产。
示例:创建线程池的时候(Executors.newCachedThreadPool(); ),直接在Executors工厂类中选择一种我们需要的套餐就可以了。 还有BitmapFactory位图工厂,专门用来将指定的图片转换为指定的位图Bitmap。
定义:通过复制原型来创建新对象。
示例:Java中所有对象都有的一个名字叫clone的方法,已经原型模式的代名词了
定义:用来创建复杂的复合对象。
示例:OkHttpClient、Retrofit的初始构建 或者Dialog
口诀:桥代理组合适配器,享元回家装饰外观
解释:有个姓桥的代理组装适配器,他儿子享元拿回家装饰外观去啦
结构型模式主要是用于处理类或者对象的组合。一共有七种:代理模式(委托)、适配器模式、装饰模式、外观模式、桥接模式、组合模式、享元模式。
定义:将两个能够独立变化的部分分离开来。
示例:AbsListView
跟ListAdapter
之间就是一个桥接模式。Window
与 WindowManager
之间也是桥接模式。
定义:控制客户端对对象的访问。 示例:ActivityManagerProxy 这个代理类
将整体与局部(树形结构)进行递归组合,让客户端能够以一种的方式对其进行处理。
示例:ViewGroup
和 View
就是典型的组合模式
定义:将原来不兼容的两个类融合在一起。
示例:ListView每一项的布局和数据都不一样,但是最后输出都可以看作是一个View。 可参考二
使用对象池来减少重复对象的创建。
示例:Message.obtainMessage通过重用Message对象来避免大量的Message对象被频繁的创建和销毁。
Decorator
定义:为对象添加新功能,同时又不改变其结构。注:继承也可以对现有对象进行拓展,但java是单继承,如果你多级包装,层级就会很复杂。
示例:ContextWrapper,通过包装ContextImpl来实现拓展,保证了ContextImpl的原始特性。然后通过ContextWrapper的多态实现,生成组件Activity、Service、Application。 参考
定义:对外提供一个统一的接口用来访问子系统。
示例:比如Context
类,里面封装了很多方法,以startActivity为例;实际上startActivity()
是通过ActivityManagerService
来实现的。但是实际开发中一般都用不到,通过封装的方式,Context
类隐藏了这些细节,我们只要简单调个方法就可以启动一个新的Activity
。
口诀:访问者写好策略备忘录,观察模板迭代的状态,命令中介解释责任链
解释:看房子的经过
行为型模式主要是描述类或者对象是怎样交互和怎样分配职责的。一共有十一种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
稳定数据结构中,定义新的操作行为。[用的比较少]
定义:封装不同的算法,算法之间能互相替换。
示例:ListView
需要设置一个Adapter
,而这个Adapter
根据我们实际的需求可以用ArrayAdapter
、SimpleAdapter
等等,这里就运用到策略模式。
定义:保存对象的状态,在需要时进行恢复。
示例:Activity的onSaveInstanceState和onRestoreInstanceState就是通过Bundle这种序列化的数据结构来存储Activity的状态,至于其中存储的数据结构,这两个方法不用关心。
定义:状态发生改变时通知观察者,一对多的关系。
示例: 点击事件,RxJava、EventBus 都是观察者模式。 List参考[策略模式]
定义:定义一套流程模板,根据需要实现模板中的操作;抽象父类,具体子类
示例:BaseActivity 里面的封装,定义了抽象的initView、initLayout、initData()等模块
定义:提供一种方法顺序访问一个聚合对象中的各个元素。
示例:各种数据结构体,如List,Map,等包含的迭代器以外,数据库查询使用Cursor,实际上就是一个具体的迭代器
定义:根据不同的状态做出不同的行为。
例子: 常见的应用在登录系统,在已登录和未登录的情况下,对于同一个点击事件的响应行为是不一样的。比如转发功能。 参考[状态模式]
把请求封装成一个对象命令发送出去,方便定制、排队、取消。
示例:Handler.post后Handler.handleMessage。
定义:将网状结构转变为星型结构,所有行为都通过中介。
示例:比如MVP,中的P也可以看作是一个中介者。可以在多个Activity引用,同时也可以调用多个M层的访问
定义:定义语法,并对其进行解释。
示例:PackageParser这个类对AndroidManifest.xml这个配置文件的解析过程,
定义:一个请求发送到接收者,接收者组成链式结构,沿着链式结构传递请求,直到有对象处理请求。
示例:1、Okhttp可以针对请求配置很多拦截器,而这些拦截器正是通过责任链模式链接起来,并最终返回处理的结果。 2、事件分发机制用到的也是责任链 3、项目启动的时候的多种弹框(更新、引导、协议、权限)
单例、构建者(Dialog)、适配器(ListView与Adapter)、模板模式(BaseActivity)、观察者模式(点击事件,RxJava、EventBus)
一句话总结23种设计模式
Android中常用的设计模式与应用场景
设计模式-速记口诀
装饰者模式
工厂模式
策略模式
状态模式