1、适配器模式(Adapter)
有两个类(客户类和被适配类)具有不兼容的接口,你想让他们一起工作,就需要一个适配器类来封装、转换被适配类的接口,让他能在客户类中使用。
有3类角色:
Client
客户类,接口与被适配类不兼容
Adaptee
被适配类,接口与客户类不兼容
Adapter
适配器,被客户类使用,在适配器中转换被适配类的接口
分为两类:
- 类适配器
比如适配器继承Activity实现View.onClickListener,View为client,被称为类适配器。
- 对象适配器
比如RecyclerView.Adapter,被适配类的实例被包含在适配器中,所以被称为对象适配器。
注:对象适配器出现得更多,因为适配器可以有一个父类BaseAdapter,比起类适配器更加灵活。
2、桥接模式(Bridge)
当有一个类,他的某些属性容易变化,就用桥接模式将抽象和实现剥离,让两者可以分开变化。
有4类角色:
Abstraction
包含一个Implementor的实例的抽象类,功能交由Implementor解决
RefinedAbstraction
抽象的泛化、实现
Implementor
一个抽象类或者接口
ContreteImplementor
Implementor的泛化、实现
注:客户端里不容易出现那么善变的类,觉得用不上= =
3、组合模式(Composite)
将多个相似的对象组合,使他们能被一起操作。
例子:ViewGroup就是组合模式
有3个角色:
Component
组合中,每个元素的抽象
Leaf
组合中,每个元素的实现。可以有很多Leaf
Composite
元素的组合,继承自Component。不同的是,新增了add和remove方法,可以增加删除元素。调用父类的方法时,会对所有元素调用一遍该方法。
注:当Component的公共方法很多时,Composite也会跟着变复杂
4、装饰模式(Decorator)
动态的给对象的方法添加功能。比起继承然后重写方法,更为灵活。
例子:Java的Writer
有4个角色:
Component
被装饰的类
ConcreteComponent
Component的实现或泛化
Decorator
Component的装饰器,继承自Component,构造函数参数为Component
ConcreteDecorator
Decorator的实现或泛化
注:与组合模式一样,当Component的公共方法很多时,Decorator工作量也会增加。用法与桥接模式类似,桥接跟适用于变化,装饰器更适用于扩展。
5、外观模式(Facade)
为大量的代码提供简单的接口。说简单点,就是子系统的外部方法。
外观模式太常用了,就比如MVC,M层和C层就都是外观模式,只要管好自己,别人干啥跟自己没关系了。
6、享元模式(Flyweight)
减少创建和修改元素的代价,重复使用元素。
通常使用哈希表以键值对的形式来存储元素,当元素再次被创建时,从哈希表中获取元素而非真的创建。
例子:RecyclerView,UniversalImageLoader
7、代理模式(Proxy)
作为另一个类的占位符,以提供访问控制、减少消耗、减少复杂性。
有3个角色:
Subject
Proxy和RealSubject共同的父类
RealSubject
Subject的泛化、实现
Proxy
与RealSubject有同样的接口
注:很像装饰模式,但是有以下不同点:
代理模式,Proxy与RealSubject有相同的接口,和相同的构造方法。但是装饰模式的构造方法的参数一定是父类。
代理模式只能是一个类的实例的代理。但是装饰模式,只要是父类的子类,都可以被装饰。