适配器模式
好久没有写博客了,最近都挺忙的,今天晚上睡不着,想想也不知道干啥,把最近自己在小组分享的适配器设计模式写出来,也就是按照自己ppt的流程来的。以后有空,陆陆续续把小组分享的设计模式写成博客。
1 问题的引入
long long ago,还记得在初中的时候,我们用手机拍了好多好看的图片,图片存在手机的内存卡(tf卡)里,某一天需要把好看的图片上传到QQ空间,那么如何把tf卡里的照片传输到电脑上呢?
1.1 我们的方式
2 适配器介绍及定义
在软件开发中有时也会存在以上电脑和TF卡不兼容的情况,这样可以引入SD卡(类似读卡器)那样一个适配器来协调这些存在不兼容的结构,这种设计方案就是适配器模式。
定义:
将一个类的接口变换成客户端所期待的另一种接口,适配器模式让那些接口不兼容的类可以一起工作。
2.1 适配器种类
适配器模式包括对象适配器和类适配器。
2.2 UML图
Target(目标抽象类): 抽象定义客户所需的接口,可以是一个抽象类,或者接口,也可以是具体类。
Adaptee(适配者类): 它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包括了客户所需要的业务方法。
Adapter(适配器类): 它可以调用另一个接口,作为一个转换器,对Adapter和Target进行适配。适配器是适配器模式的核心,在类适配器中,它通过实现Target接口并继承Adaptee类来使二者产生联系;在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
2.3 两种适配器的区别
区别:
1.在对象适配器模式当中,适配器和适配者是关联关系。
2.在类适配器模式中,适配器和适配者之间是继承(或者实现)关系。
3.由于Java不支持多重类继承,因此类适配器的使用受到很多限制,例如如果目标抽象类Target不是接口,而是一个类,就无法使用类适配器。大部分情况下我们使用的是对象适配器,类适配器较少使用。
3代码讲解
实例: 回到刚开头的那个例子,计算机如何通过SD(读卡器)读取TF卡(通过对象适配器的模式)?
3.1 编写Target
3.1.1 声明Computer接口及其具体实现类
public interface Computer {
/**
* sdCard对象传参
* @param sdCard
* @return
*/
String readSD(SDCard sdCard);
}
public class ThinkpadComputer implements Computer {
/**
* 创建一个计算机实例,实现计算机接口,并实现其读取SD卡方法
* @param sdCard
* @return
*/
@Override
public String readSD(SDCard sdCard) {
if(sdCard == null){
throw new NullPointerException("sdCard is null");
}
//返回sdCard的read方法
return sdCard.readSD();
}
}
3.1.2 声明SDCard接口及其具体实现类
public interface SDCard {
/**
* 创建一个SD卡的接口,读取SD卡
* @return
*/
String readSD();
}
public class SDCardImpl implements SDCard {
/**
* 创建SD卡接口的实现类,模拟SD卡的功能:
* @return
*/
@Override
public String readSD() {
String msg = "sdCard read a message: wow this is sdCard!";
return msg;
}
}
3.2 编写Adaptee
3.2.1 创建TF卡接口及其具体实现类
public interface TFCard {
/**
* 创建TF卡接口
* @return
*/
String readTF();
}
public class TFCardImpl implements TFCard {
/**
* 创建TF卡实例
* @return
*/
@Override
public String readTF() {
String msg ="tfCard read e message : wow this is tfCard.";
return msg;
}
}
3.3 编写Adapter
3.3.1 创建适配器类
public class SDAdapterTF implements SDCard {
/**
* 创建SD卡适配TF卡 ,实现SDCard接口
* 将要适配的对象作为适配器的属性引入
*/
private TFCard tfCard;
public SDAdapterTF(TFCard tfCard){
this.tfCard = tfCard;
}
@Override
public String readSD() {
System.out.println("adapter read tfCard.");
return tfCard.readTF();
}
}
3.4 创建Client
3.4.1 创建测试方法调用
/**
* 测试计算机通过SD读卡器读取TF卡
*/
@Test
public void test(){
//模拟计算机通过SD读卡器读取TF卡
Computer computer = new ThinkpadComputer();
TFCard tfCard = new TFCardImpl();
SDCard tfCardAdapterSD = new SDAdapterTF(tfCard);
System.out.println(computer.readSD(tfCardAdapterSD));
}
4 总结
适用场景:
将一个类的接口变换成客户端所期待的另一种接口,适配器模式让那些接口不兼容的类可以一起工作。
两类适配器:
对象适配器和类适配器,类适配器较少使用。