概述
- 定义:将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作
- 适用场景:被使用接口的与当前系统不兼容,但又无法修改接口时可以使用适配器模式
实现
类适配器
// 被适配的类
public class Adaptee {
// 不兼容的方法
public void operation2() {
System.out.println("adaptee");
}
}
// 当前系统接口
public interface ITarget {
void operation();
}
// 适配器
public class Adapter extends Adaptee implements ITarget {
@Override
public void operation() {
super.operation2();
}
}
// 客户端
public class Client {
public static void main(String[] args) throws Exception {
ITarget target = new Adapter();
target.operation();
}
}
可以看出类适配器使用继承方式完成适配,但是java不支持多继承,也就是说类适配器只能服务于一个被适配对象,而且由于适配器是被适配的类的子类,被适配类的属性、方法都会暴露给适配器,无疑会影响安全性和可控性,因此此方式应用较少
对象适配器
// 适配器
public class Adapter implements ITarget {
private Adaptee adaptee;
// 不使用继承而改用关联
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void operation() {
adaptee.operation2();
}
}
// 客户端
public class Client {
public static void main(String[] args) throws Exception {
Adaptee adaptee = new Adaptee();
ITarget target = new Adapter(adaptee);
target.operation();
}
}
对象适配器抛开了多继承的限制,可以服务于多个被适配对象
实际应用
java.io.InputStreamReader
在java中InputStream是面向字节流的,而Reader是面向字符流的,这两个输入流是完全不兼容的两套API,因此JDK中提供了适配器InputStreamReader实现了字节流到字符流的转换
// 对象适配器
InputStream ins = new FileInputStream("1.txt");// 被适配对象
Reader reader = new InputStreamReader(ins);// Reader为目标接口,InputStreamReader为适配器
reader.read();// 调用目标接口方法
reader.close();