3.4 适配器模式(Adapter)
用途:将一个类的接口转换成客户希望的另一个类的接口。
例子:电脑网线USB转接器
角色:
电脑(客户端)、网线、转接器、目标接口NetToUsb
- 目标接口或抽象类(目标抽象类或目标抽象接口):这里例子中就是目标接口USB。
- 适配者类(需要适配的类 Adaptee):它定义了一个已经存在的接口,这个接口需要被适配。在这个例子中网线类就是那个已经存在的接口,但是网线不可以直接插到电脑的USB上。
- 适配器类(Adapter):包装网线,让网线支持USB接口,把网线插到USB上并处理请求。
- 适配器类需要同时和两个类打交道,它要把网线和电脑的USB接口连接在一起。有两种方式,
- 一种是继承要被适配的类(网线类)同时实现目标接口。
- 另一种是使用组合模式,不去继承适配者类,而是使用聚合的方式,让网线类作为适配器类的一个成员变量,然后再去实现目标抽象接口。
分类:
- 类适配器:继承模式,继承需要被适配的类,实现目标抽象接口。
- 对象适配器:组合模式,把需要适配的类作为成员属性变量,同时实现目标抽象接口。
核心理解
适配器模式做的事情是这样的:
有两个不相干的类,但是它们想组合到一起使用,那么就通过一个适配器把二者适配在一起使用。
比如说:电脑有一个USB接口,而网线的接头不是USB的,可是电脑想上网,那么就需要一个接口转接的适配器来完成这个工作,这时候会出现三个类。
- 网线类:这个类提供了具体要实现的业务方法,也就是它可以完成上网这件事,比如说有一个方法是net()
- USB接口类:这个接口是用户想要的接口,用户希望通过USB接口完成上网这件事,比如说有一个方法是execute()
- 转接器类:这个类来完成二者的适配:首先实现USB接口,然后或者通过继承网线类或者通过组合网线类,选择二者的任意一个方式,重写USB接口里的方法execute(),在这个方法里去调用网线类的真实业务方法net()来完成上网这件事
- 客户端在调用时,只需要把实例化的网线类通过set注入交给适配器,然后通过调用适配器类的execute()方法就可以完成上网这件事情!