适配器模式
将一个类的接口转换为客户希望的另一个接口。使原本由于接口不兼容而不能一起工作的类可以在一起工作。
主要角色:
目标接口(Target): 客户期待的接口。目标可以是具体或抽象的类,或接口。
需要适配的类(Adaptee)
适配器(Adapter):通过包装一个需要适配的对象,将原接口转换为目标接口。
举个例子:
笔记本电脑只有usb接口,需要连接一个ps/2键盘。
这里笔记本电脑就是客户端,需要调用ps/2键盘,但是它只有usb接口,不兼容,无法调用,目标接口就是usb,键盘就是需要适配的类,那么需要一个转换器实现适配。
实现
Adaptee:
// 需要适配的类。例子中的键盘。
public class Adaptee {
public void request() {
System.out.println("可以完成客户需要的功能!");
}
}
Target:
// 目标接口。例子中的usb。
public interface Target {
void handleReq();
}
Adapter:
有两种适配器模式:
一种是类适配器:
适配器继承了要适配的类, 同时它实现了目标接口。
public class Adapter extends Adaptee implements Target {
@Override
public void handleReq() {
super.request();
}
}
另一种是对象适配器:使用组合的方式与被适配对象整合。
public class Adapter2 implements Target {
private Adaptee adaptee;
@Override
public void handleReq() {
adaptee.request();
}
public Adapter2(Adaptee adaptee) {
super();
this.adaptee = adaptee;
}
}
对应的客户端也就有两种写法:
public class Client {
public static void main(String[] args) {
Client c = new Client();
Adaptee a = new Adaptee();
// Target t = new Adapter(); // 写法一:类适配器
Target t = new Adapter2(a); //写法二:对象适配器
c.test1(t);
}
public void test1(Target t) {
t.handleReq();
}
}
应用场景
旧系统的改造升级
java.io.InputStreamReader(InputStream) —>字节流通过适配器转化为字符流
java.io.OutputStreamWriter(OutputStream)