适配器模式
目的:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.
假设场景:以前的手机是有内存卡的,手机用户把数据放在内存卡里,手机是可以直接读取内存卡中的数据的。但是后来这种用内存卡的手机慢慢被淘汰了,可是你又想读取内存卡中的数据,于是你买了个电脑读取,但是电脑只能读取u盘的数据,不能够直接读取内存卡中的数据,电脑需要读卡器间接读取内存卡中的数据。
这里的内存卡就是需要转换的接口,我们现有的东西(电脑)无法兼容使用这个接口(内存卡),所以我们需要一个适配器(读卡器),让电脑持有读卡器,这样才可以读取内存卡的数据。
编写代码:
U盘 和 内存卡都是外部设备,我们统一编写个抽象类:
package adapter.study;
/**
* 磁盘
* @author 阿呆的小鸡仔
*/
public abstract class Disk {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
package adapter.study;
/**
* 内存卡类
* @author 阿呆的小鸡仔
*/
public class MemoryCard extends Disk {
}
package adapter.study;
/**
* U盘
* @author 阿呆的小鸡仔
*/
public class Udick extends Disk{
}
读卡器和电脑都可以读取外部设备的数据,我们就写个读取外部数据接口:
package adapter.study;
/**
* 读取外部数据
* @author 阿呆的小鸡仔
*/
public interface ReadExternalData {
/**
* 读取外部数据
* @param disk 外部介质
*/
public void read(Disk disk);
}
package adapter.study;
/**
* 读卡器
* @author 阿呆的小鸡仔
*/
public class CardReaderAdapter implements ReadExternalData {
@Override
public void read(Disk disk) {
System.out.println("读取了手机内存卡的数据");
}
}
package adapter.study;
/**
* @author 阿呆的小鸡仔
*/
public class Computer implements ReadExternalData {
ReadExternalData readExternalData=new CardReaderAdapter() ;
@Override
public void read(Disk disk) {
if(disk instanceof Udick){
System.out.println("电脑读取了U盘数据: "+disk.getData());
}
else if(disk instanceof MemoryCard){
readExternalData.read(disk);
}
else {
System.out.println("电脑无法识别该设备");
}
}
}
客户端使用电脑读取内存卡数据:
package adapter.study;
/**
* @author 阿呆的小鸡仔
*/
public class Client {
public static void main(String[] args) {
Disk u=new Udick();
u.setData("我是U盘!");
Disk p=new MemoryCard();
p.setData("我是内存卡");
ReadExternalData computer=new Computer();
computer.read(u);
computer.read(p);
}
}