[Java] [设计模式] [行为型模式] [适配器模式]
定义
把一个类的接口变换成客户端所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
模型结构
适配器模式的分类
1、类适配器模式
类适配器简单的 UML
总结一下就是:适配器「Adapter」继承源类「Src」并且实现目标「Dst」接口,来实现 Src–>Dst 的转换
2、对象适配器模式
对象适配器简单的 UML
总结一下就是:适配器「Adapter」持有源类「Src」的引用,并实现目标「Dst」接口,来实现 Src–> Dst 的转化
3、接口适配器模式
对于这种模式「资料上也没有说有这种模式,我是在写代码的过程中发现可以这样写」,我持保留意见,如果有什么问题,大家完全可以说适配器模式的分类就有以上两种模式,可我认为这是适配器模式的一个变种
接口适配器简单的 UML
总结一下就是: 适配器实现源和目标,把源转化成目标这么一个过程
示例
// 目标接口,或称为标准接口,即客户所期待的接口
interface Target {
public void request();
}
// 具体目标类,只提供普通功能
class ConcreteTarget implements Target {
public void request() {
System.out.println("普通类 具有 普通功能...");
}
}
// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类,也是需要被适配的类
class Adaptee {
public void specificRequest() {
System.out.println("被适配类具有特殊功能...");
}
}
// 适配器类,继承了被适配类,同时实现标准接口
class Adapter extends Adaptee implements Target{
public void request() {
super.specificRequest();
}
}
// 测试类public class Client {
public static void main(String[] args) {
// 使用普通功能类
Target concreteTarget = new ConcreteTarget();
concreteTarget.request();
// 使用特殊功能类,即适配类
Target adapter = new Adapter();
adapter.request();
}
}
Android中的实例
比较典型的有ListView和RecyclerView。为什么ListView需要使用适配器呢?ListView用于显示列表数据,但列表数据形式多种多样,为了处理和显示不同的数据,我们需要对应的适配器作为桥梁。这样ListView就可以只关心它的每个ItemView,而不用关心这个ItemView具体显示的是什么。而我们的数据源存放的是要显示的内容,它保存了每一个ItemView要显示的内容。ListView和数据源之间没有任何关系,这时候,需要通过适配器,适配器提供getView方法给ListView使用,每次ListView只需提供位置信息给getView函数,然后getView函数根据位置信息向数据源获取对应的数据,根据数据返回不同的View。
重构
当想使用一个既有类的接口,但是这个既有类与目前的代码结构不相兼容的时候可以考虑使用适配器模式。