适配器模式
简单介绍
适配器模式用于解决两个不同对象之间的兼容问题。比如我们要对接第三方服务,他们的传递过来的数据和我们使用的数据之间是不兼容的,这就需要我们加一个中间层来处理兼容问题。我们需要把我们的数据提取出来,然后拼接成他们想要的数据,请求他们,然后从他们的服务获得结果,然后解析结果,更新我们的表里面的数据。在我们的生活中,很多地方都用到了适配器模式,比如,电源适配器,usb读卡器等.
我们的电脑有很多接口,比如usb,我们的电脑要想读取存储卡里面的数据,就需要一个设备。这个设备叫做读卡器,读卡器作为一个适配器,实现了usb接口,并且能够读取存储卡的数据,那电脑就能通过usb接口来和这个适配器来进行通信,我们创建一个例子
先看一下类间关系
继承关系
代码实现
首先就是我们的usb接口
public interface IUSB {
/**
* usb供电
* @param voltage
*/
void powerOn(Double voltage);
void readData();
}
我们的usb接口,定义了两个方法,一个方法用来供电,一个方法用来获取原始数据
接下来看看读卡器接口
public interface ICardReader extends IUSB{
void insertFlashMemory(IFlashMemory flashMemory);
}
读卡器需要插入存储卡,这就定义了一个继承usb接口的读卡器接口
然后看一下实现了读卡器接口的一个类
public class XXCardReader implements ICardReader {
private IFlashMemory flashMemory;
boolean isPowerOn=false;
@Override
public void insertFlashMemory(IFlashMemory flashMemory) {
this.flashMemory=flashMemory;
}
@Override
public void powerOn(Double voltage) {
if(Math.abs(voltage-5)<=1){
System.out.println("好的,usb正常供电");
isPowerOn=true;
}else{
System.out.println("供电错误");
isPowerOn=false;
}
}
@Override
public void readData() {
if(isPowerOn){
System.out.println(flashMemory.getRawData());
}else{
System.out.println("读卡器没能正常供电");
}
}
}
读卡器首先要供电,如果电压5v左右就就行
然后我们看一下电脑接口
public interface IComputer {
/**
* 供电
* @param
*/
boolean powerOn();
/**
* 获得电脑可用的usb数量
* @return
*/
int getAvailableUsbs();
/**
* 往指定索引插上usb索引
* @param index
* @param iusb
*/
void insertUsb(int index,IUSB iusb);
/**
* 获得这个电脑上插入的usb设备
* @param index
* @return
*/
IUSB getUsbDevice(int index);
/**
* 给电脑设置电源适配器
* @param adapter
*/
void setPowerAdapter(IPowerAdapter adapter);
/**
* 获得usb的电压
* @return
*/
Double getUsbVoltage();
}
电脑需要开机,需要获得可用的usb接口数量,然后插入usb设备,获得usb设备,插上电源适配器,以及获得usb电压
然后我们看一下实现了电脑接口的一个类
public class HaseeComputer implements IComputer{
private List<IUSB> usbDevices=new ArrayList<>();
private IPowerAdapter adapter;
private boolean isPowerOn=false;
@Override
public boolean powerOn() {
if(adapter==null){
System.out.println("没有适配器");
return false;
}
if(Math.abs(adapter.output()-19)<=3){
//给所有usb供电
for(IUSB iusb:usbDevices){
iusb.powerOn(getUsbVoltage());
}
System.out.println("好了,电脑正在供电");
isPowerOn=true;
return true;
}else{
System.out.println("电源适配器输出有问题,无法正常供电,需要19v电压");
isPowerOn=false;
return false;
}
}
@Override
public int getAvailableUsbs() {
return 5;
}
@Override
public void insertUsb(int index, IUSB iusb) {
if(index>getAvailableUsbs()-1){
System.out.println("当前电脑只有"+getAvailableUsbs()+"个usb设备,不能往"+index+"索引插入usb设备");
return;
}
System.out.println("已经往电脑"+index+"索引插入usb设备");
usbDevices.add(index,iusb);
}
@Override
public IUSB getUsbDevice(int index) {
if(!isPowerOn){
System.out.println("电脑未开机");
return null;
}
if(index>getAvailableUsbs()-1){
System.out.println("当前电脑只有"+getAvailableUsbs()+"个usb设备,不能往"+index+"索引插入usb设备");
return null;
}
return usbDevices.get(index);
}
@Override
public void setPowerAdapter(IPowerAdapter adapter) {
this.adapter=adapter;
}
@Override
public Double getUsbVoltage() {
return 5D;
}
}
我们再写一个测试类来测试一下
public class Content {
public static void main(String[] args) {
HaseeComputer haseeComputer = new HaseeComputer();
XXCardReader xxCardReader = new XXCardReader();
xxCardReader.insertFlashMemory(new IFlashMemory() {
@Override
public String getRawData() {
return "我是存储卡,原始数据";
}
});
haseeComputer.insertUsb(0, xxCardReader);
haseeComputer.setPowerAdapter(new IPowerAdapter() {
@Override
public Double input() {
return 220D;
}
@Override
public Double output() {
return 19D;
}
});
haseeComputer.powerOn();
IUSB userDevice = haseeComputer.getUsbDevice(0);
userDevice.readData();
}
}
output:
已经往电脑0索引插入usb设备
好的,usb正常供电
好了,电脑正在供电
我是存储卡,原始数据
Process finished with exit code 0
可以看见,这里我们用了适配器设计模式,两个对象之间通过接口来进行调用,然后接口的实现交给适配器,这种写法很灵活,调用者只需要根据接口来调用就行了
完整代码可以去我的GitHub