将一个类的接口转换成客户希望的另外一个接口,使得原来由于接口不兼容而不能一起工作的那些类能一起工作。
我们的电脑只能读取SD卡,现在我们有一张TF卡也需要使用电脑读取出来。此时我们就需要增加一个适配器来适配TF卡。
适配者:SD卡。
/**
* 适配者
*/
public interface SDCard {
String readSD();
void writeSD(String msg);
}
public class SDCardImpl implements SDCard {
@Override
public String readSD() {
return "read sd card";
}
@Override
public void writeSD(String msg) {
System.out.println("write msg to sd card");
}
}
目标:TF卡。
public interface TFCard {
String readTF();
void writeTF(String msg);
}
public class TFCardImpl implements TFCard {
@Override
public String readTF() {
return "read tf card";
}
@Override
public void writeTF(String msg) {
System.out.println("write msg to tf card");
}
}
适配器类:需要继承目标实现类TFCardImpl,并且实现适配者接口SDCard。内部实现最终还是调用的是目标实现类的方法。
public class TF2SDCardAdapter extends TFCardImpl implements SDCard {
@Override
public String readSD() {
return this.readTF();
}
@Override
public void writeSD(String msg) {
this.writeTF(msg);
}
}
电脑Computer
public class Computer {
public String readSD(SDCard sdCard) {
return sdCard.readSD();
}
}
Client
public class Client {
public static void main(String[] args) {
Computer computer = new Computer();
String sdCardMsg = computer.readSD(new SDCardImpl());
System.out.println(sdCardMsg);
// 读取TF卡
String tfCardMsg = computer.readSD(new TF2SDCardAdapter());
System.out.println(tfCardMsg);
}
}
类适配器模式 TF2SDCardAdapter extends TFCardImpl
需要继承目标实现类,java是单继承的,如果继承了目标实现类那么适配器类就不能再继承其它类了,这是类适配器不好的地方。
对象适配器模式可以采用将现有组件库中的已经实现的组件引入适配类中,该类同时实现当前系统的业务接口。
对象适配器模式不需要继承,只需要将目标对象引入作为属性即可。
public class TFToSDCardAdapter implements SDCard {
// 目标接口
private TFCard tfCard;
// 只提供一个有参构造函数
public TFToSDCardAdapter(TFCard tfCard) {
this.tfCard = tfCard;
}
@Override
public String readSD() {
return tfCard.readTF();
}
@Override
public void writeSD(String msg) {
tfCard.writeTF(msg);
}
}
Client
public class Client {
public static void main(String[] args) {
Computer computer = new Computer();
String sdCardMsg = computer.readSD(new SDCardImpl());
System.out.println(sdCardMsg);
// 读取TF卡
String tfCardMsg = computer.readSD(new TFToSDCardAdapter(new TFCardImpl()));
System.out.println(tfCardMsg);
}
}
适配器模式其实就是对目标对象的一种包装,然后暴露出来统一的方法签名而已。