一、定义
将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式又叫做变压器模式,也叫做包装模式(Wrapper),但是包装模式可不止一个,还包括了之前的装饰者模式。
扩展:
适配器模式最开始的应用实在工业上,如下图A、B两个图框代表已经塑模成型的物体A和物体B,那现在要求把A和B安装在一起使用,如何安装?两者的接口不一致,是不可能安装在一起使用的,那怎么办?引入一个物体C,即
其中的物体C就是我们说的适配器,它在中间起到了角色转换的作用,把原有的长条形接口转换了三角形接口。在我们软件业的设计模式中,适配器模式也是相似的功能。
二、适配器模式的主要角色
1. Target
目标角色
该角色定义把其他类转换为何种接口,也就是我们的期望接口。
public interface Target { //目标角色有自己的方法 public void request(); } public class ConcreteTarget implements Target { public void request() { System.out.println("if you need any help,pls call me!"); } }
2. Adaptee
被适配者
该角色即源角色。
public class Adaptee { //原有的业务逻辑 public void doSomething(){ System.out.println("I'm kind of busy,leave me alone,pls!"); } }
3. Adapter
适配器
该角色即适配器模式的核心角色,它的职责十分简单,就是把 Adaptee 转化成 Target,怎么转化?通过继承或者类关联的方式。
public class Adapter extends Adaptee implements Target { public void request() { super.doSomething(); } }
三、适配器模式的优点
- 可以让两个没有关系的类一起运行
- 提高了类的复用度
- 灵活性非常好
四、适配器的分类
1. 类适配器
通过继承关系进行适配的适配器叫做类适配器,类适配器一般是通过覆写源角色的方法进行扩展,例如public class Adapter extends Adaptee implements Target { public void request() { super.doSomething(); } }
2. 对象适配器
通过类的关联关系进行耦合的适配器叫做对象适配器,一般持有几个对象的引用,在设计时也比较灵活,例如public class Adapter implements Target { private Adaptee1 adaptee1; private Adaptee2 adaptee2; public Adapter(Adaptee1 adaptee1, Adaptee2 adaptee2) { this.adaptee1 = adaptee1; this.adaptee2 = adaptee2; } public void request() { adapter1.doSomething(); adapter2.doSomething(); } }
五、适配器模式的应用
- 系统扩张时
ListView
等的数据适配
ListView
等,使用它们都需要我们设置一个适配器(继承自
BaseAdapter
)。因为布局的绘制需要的都是
View
对象,而我们的数据全是千奇百怪,所以就需要有这么一个适配器,将各种各样的数据转化成
View
对象。
查看更多:设计模式分类以及六大设计原则