目录
适配器模式概念
主要实现方式
主要组成
UML用例图
代码示例
生活场景
应用场景
适配器模式概念
适配器模式属于结构型设计模式,它的主要目的是将一个类的接口转换成客户端所期望的另一种接口形式,使得原本接口不兼容的类可以一起工作。
主要实现方式
- 类适配器。类适配器的实现需要支持多继承(如C++),因为该类型适配器是通过多继承被适配者和目标接口,由于目标接口可以是抽象类或者接口,被适配者可以是类或接口。所以两者都有可能是类。自然不适用于单继承。
- 对象适配器。对象适配器不需要多继承,单继承就行(如Java)。该类型适配器通过将被适配器者作为属性引用(就像Spring中的属性注入)。这种方式更加灵活,因为它不依赖于被适配者的具体实现,只需要知道它的接口即可。
主要组成
- 目标接口(target)。 客户端所期待的接口。目标接口可以是抽象类或接口,定义了客户端期望的方法。
- 被适配者(adaptee)。需要适配的类或接口。包含一些客户端可能需要的方法,但接口形式与客户端所期望的接口不兼容。
- 适配器(adapter)。适配器类是核心,它将被适配者的接口转换成目标接口。主要有两种,类适配器和对象适配器。通过实现目标接口,被适配者作为该类属性以及传入被适配者实例(适用对象适配器)或者继承被适配者类(适用类适配器),目的调用被适配者的方法。最终返回一个目标实例,也就是适配器实例,通过调用适配器中的方法,完成接口转换。
UML用例图
以对象适配器为例
代码示例
以对象适配器为例,举个例子,生活中的插头有两脚的、三脚的,之间就需要转换。接下来使用代码将三脚转为两脚插头使用。
两脚插头接口(目标)
// 两脚插头接口
public interface TwoPinPlug {
void connectionTwoPin();
}
三脚插头类(被适配者)
// 三角插头接口
public interface ThreePinPlug {
void connectionThreePin();
}
// 三角插头实现
public class ThreePinPlugImpl implements ThreePinPlug {
@Override
public void connectionThreePin() {
System.out.println("三角插头连接成功");
}
}
适配器类
// 适配器类,将三脚转为两脚,实现两脚接口,成为两脚接口的子类
public class PlugPinAdapter implements TwoPinPlug {
// 三角(源)属性注入
private ThreePinPlug threePlug;
// 有参构造,传入三脚(源)接口
public PlugPinAdapter(ThreePinPlug threePlug) {
this.threePlug = threePlug;
}
@Override
public void connection() {
// 调用三脚(源)接口
threePlug.connection();
System.out.println("通过适配器转换...");
System.out.println("转换成为两脚插头");
}
}
客户端
public class Client {
public static void main(String[] args) {
// 创建一个三脚插头实例
ThreePinPlugImpl threePlug = new ThreePinPlugImpl();
// 创建插头适配器,传入三脚插头实例,返回两脚插头实例
TwoPinPlug twoPinPlug = new PlugPinAdapter(threePlug);
// 执行两脚插头实例方法(其实也是适配器中的方法)
twoPinPlug.connectionTwoPin();
}
}
结果
生活场景
- 耳机转换头:现在有的手机是没有耳机插孔的,但是充电的地方其实也可以充当耳机孔,这时候就需要耳机转换的适配器,转成手机支持的插孔。
- 电压转换器:生活中常见的充电器,就是将220V电压转换成充电设备支持的电压。
应用场景
- JDBC驱动程序:不同的数据库提供商实现了不同的JDBC驱动接口,使用适配器模式可以将这些不同的接口适配为标准的JDBC接口,提高应用程序的可移植性
- 处理器适配器(HandlerAdapter):SpringMVC工作流程中的出现的处理器适配器(HandlerAdapter),前端控制器(DispatcherServlet)会根据找到的处理器,选择一个合适的HandlerAdapter。HandlerAdapter有多个实现,用于适配不同类型的处理器。在这个过程中,处理器适配器(HandlerAdapter)起到了桥梁的作用,它连接了DispatcherServlet和具体的处理器(Controller),使得不同类型的处理器能够被统一调用和执行。