Java设计模式之——Adapter(适配器模式)
·
一、什么是适配器模式?
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能,也就是将两个不兼容的功能通过Adapter兼容在一起。
例如,我有一台电脑,支持USB接口,我的鼠标也是USB接口的,自然,可以直接使用,但是我有一张SD卡,电脑没有相应接口当然无法直接读取,当然我们可以选择——读卡器,没错,读卡器就相当于适配器,将SD卡接口转接为USB接口,可以让电脑读取SD的东西。
这样的东西还有很多,比如SpringMVC中的处理器适配器,我们的映射地址可能来自XML配置文件,也有可能来自@RequestMapping,那么我们就需要一个适配器,进行处理映射地址。
二、模式结构
适配器模式(Adapter)包含以下主要角色。
- 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。(相当于上述例子的USB接口)
- 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。(相当于SD卡)
- 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。(相当于读卡器)
三、实现
3.1、类适配器
为什么叫类适配器呢?它是由类继承实现。
根据以上USB的例子,
/**
* USB接口
*/
interface Usb {
void use();
}
/**
* 鼠标实现USB类
*/
class MouseUsb implements Usb {
public void use() {
System.out.println("我是鼠标,可以使用USB接口");
}
}
这时候,我们使用鼠标当然很正常,但是,现在我们需要使用SD卡,下面是SD卡的代码。
/**
* SDCard接口
*/
interface SDCard {
void useSD();
}
/**
* SDCard 类
*/
class SDCardHandle implements SDCard {
public void useSD() {
System.out.println("我是SD卡,经过转换才能使用USB接口");
}
}
也就是说SDCard接口和USB接口是功能完全不相同的两个接口。如果想将他们兼容在一起,那么必须使用适配器。
/**
* SDCard适配器,也就是现实中的读卡器,继承了SDCard
*/
class SDCardAdapter extends SDCardHandle implements Usb {
public void use() {
super.useSD();
}
}
现在我们开始使用它
public class ClassAdapterTest {
public static void main(String[] args) {
Usb usb1 = new MouseUsb();
usb1.use();
Usb usb2 = new SDCardAdapter();
usb2.use();
}
}
运行结果
我是鼠标,可以使用USB接口
我是SD卡,经过转换才能使用USB接口
3.2、对象适配器
对象适配器和类适配器比较相似,通过对象调用方法的形式。代码如下,大家可以比较一下便知晓。
/**
* USB接口
*/
interface Usb {
void use();
}
/**
* 鼠标实现USB类
*/
class MouseUsb implements Usb {
public void use() {
System.out.println("我是鼠标,可以使用USB接口");
}
}
/**
* SDCard接口
*/
interface SDCard{
void useSD();
}
/**
* SDCard 类
*/
class SDCardHandle implements SDCard {
public void useSD() {
System.out.println("我是SD卡,经过转换才能使用USB接口");
}
}
/**
* SDCard适配器,也就是现实中的读卡器,注意此处的不同
*/
class SDCardAdapter implements Usb {
SDCardHandle sdCardHandle;
public SDCardAdapter(SDCardHandle sdCardHandle) {
this.sdCardHandle = sdCardHandle;
}
public void use() {
sdCardHandle.useSD();
}
}
/**
* 主类
*/
public class ObjectAdapterTest {
public static void main(String[] args) {
Usb usb1 = new MouseUsb();
usb1.use();
Usb usb2=new SDCardAdapter(new SDCardHandle());
usb2.use();
}
}
四、结语
本文代码已经上传到 码云,需要的点击下载(https://gitee.com/luckylqm/DesignPatterns),喜欢本教程的可以star一下,感谢您的阅读!
更多推荐
已为社区贡献1条内容
所有评论(0)