适配器模式
如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供我们充电,这样使得我们的插头在当地能使用。生活中这样的例子很多,手机充电器(将220v转换为5v的电压),读卡器等,其实就是使用到了适配器模式。
定义
将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
角色
- 目标接口:当前业务所期待的接口,它可以是抽象类或接口
- 适配者类:它是被访问和被适配的现存组件库中的接口
- 适配器类:它是一个转换器,通过继承或者引用适配者的对象,把适配者对象转换为目标接口,让用户按目标接口的格式访问适配者
实现
现有一台仅等插入SD卡的电脑,但手中只有TF卡,下面就来实现电脑适配TF卡
1.电脑类-只能使用SD卡
public class Computer {
SDCard sdCard;
public Computer(SDCard sdCard) {
this.sdCard = sdCard;
}
//==========使用sd卡方式1
public String read() {
return sdCard.read();
}
public void write(String msg) {
sdCard.write(msg);
}
//=============使用sd卡的方式2---adcard对象放在方法参数
public String read(SDCard sdCard) {
return sdCard.read();
}
public void write(String msg,SDCard sdCard) {
sdCard.write(msg);
}
}
2.目标接口
public interface SDCard {
String read();
void write(String msg);
}
2-1目标接口实现类
public class SDCardImpl implements SDCard{
@Override
public String read() {
String msg = "SD=>read";
return msg;
}
@Override
public void write(String msg) {
System.out.println("SD=>write:"+msg);
}
}
3.被适配的或者适配者接口
public interface TFCard {
String readTF();
void writeTF(String msg);
}
3-1被适配的或者适配者接口的实现类
public class TFCardImpl implements TFCard{
@Override
public String readTF() {
String msg = "TF=>read";
return msg;
}
@Override
public void writeTF(String msg) {
System.out.println("TF=>write:" + msg);
}
}
4.适配器类
public class SDAdapterTF extends TFCardImpl implements SDCard{
@Override
public String read() {
return readTF();
}
@Override
public void write(String msg) {
writeTF(msg);
}
}
5.测试类及其输出结果
public class Test {
public static void main(String[] args) {
Computer computer = new Computer(new SDAdapterTF());
System.out.println(computer.read());//输出:TF=>read
}
}
小细节:该案例是以类适配器模式实现的,适配器还有一种叫做对象适配器模式的,即如果SDcard只有类没有其顶层接口,这时就要使用对象适配器模式,具体做法是在适配器类中以组合的方式引用SDcard对象,通过构造传参。