文章目录
- 1.概念
-
- [1.1 什么是适配器模式](#1.1 什么是适配器模式)
- [1.2 优点与缺点](#1.2 优点与缺点)
- 2.实现方式
-
- [2.1 类适配器模式](#2.1 类适配器模式)
- [2.2 对象适配器模式](#2.2 对象适配器模式)
- [3 Java 哪些地方用到了适配器模式](#3 Java 哪些地方用到了适配器模式)
- [4 Spring 哪些地方用到了适配器模式](#4 Spring 哪些地方用到了适配器模式)
1.概念
1.1 什么是适配器模式
简单来说,适配器模式就是作为两个不兼容接口之间的
桥梁
。
1.2 优点与缺点
优点 :
1.可以让原本接口不兼容的类可以合作无间。
2.增加了类的透明性和复用性,现有的系统不改变的前提下引进新的接口。
3.灵活性好,可以通过配置文件来更换适配器。
4.系统可以更易于扩展。
缺点 :
1.适配器编写过程需要一定的技巧,如果接口差异过大,适配器编写会非常复杂。
2.增加系统的理解与设计难度,由于适配器模式将一些简单的接口转换成复杂的接口,增加阅读难度。
2.实现方式
2.1 类适配器模式
类适配器模式通过多重继承来实现,它同时继承了目标接口和被适配者的类。这样,适配器就可以在继承自被适配者的类的基础上,实现目标接口。
java
// Lightning接口
public interface Lightning {
void chargeLightning();
}
// Lightning充电器
public class LightningCharger implements Lightning {
@Override
public void chargeLightning() {
System.out.println("Charging via Lightning connector.");
}
}
// MicroUSB接口
public interface MicroUSB {
void chargeMicroUSB();
}
// 类适配器
public class MicroUSBClassAdapter extends LightningCharger implements MicroUSB {
@Override
public void chargeMicroUSB() {
// 直接使用继承自LightningCharger的方法
System.out.println("Class Adapter converts MicroUSB to Lightning.");
this.chargeLightning();
}
}
// 使用类适配器模式
public class AdapterDemo {
public static void main(String[] args) {
MicroUSBClassAdapter microUSBClassAdapter = new MicroUSBClassAdapter();
microUSBClassAdapter.chargeMicroUSB();
}
}
2.2 对象适配器模式
对象适配器模式通过组合来实现,它持有一个被适配者的实例,并在适配器中实现目标接口。适配器将目标接口的调用转发给被适配者的相应方法。
java
// Lightning接口
public interface Lightning {
void chargeLightning();
}
// Lightning充电器
public class LightningCharger implements Lightning {
@Override
public void chargeLightning() {
System.out.println("Charging via Lightning connector.");
}
}
// MicroUSB接口
public interface MicroUSB {
void chargeMicroUSB();
}
// 对象适配器
public class MicroUSBObjectAdapter implements MicroUSB {
private Lightning lightning;
public MicroUSBObjectAdapter(Lightning lightning) {
this.lightning = lightning;
}
@Override
public void chargeMicroUSB() {
// 适配器将MicroUSB充电请求转换为Lightning充电
System.out.println("Object Adapter converts MicroUSB to Lightning.");
lightning.chargeLightning();
}
}
// 使用对象适配器模式
public class AdapterDemo {
public static void main(String[] args) {
LightningCharger lightningCharger = new LightningCharger();
MicroUSBObjectAdapter microUSBObjectAdapter = new MicroUSBObjectAdapter(lightningCharger);
microUSBObjectAdapter.chargeMicroUSB();
}
}
对象适配器模式更加灵活,因为它可以在运行时改变被适配者的实例,而类适配器模式则在编译时就已经确定了被适配者的类。
3 Java 哪些地方用到了适配器模式
JDBC
(Java Database Connectivity): JDBC使用适配器模式来连接不同的数据库。DriverManager类充当适配器,它根据URL选择合适的Driver实现,并将JDBC调用转换为特定数据库的调用。
AWT
(Abstract Window Toolkit)事件监听器: AWT使用适配器模式来处理事件。例如,AWTEventMulticaster类充当适配器,它将事件源的事件转发给事件监听器。
Java I/O
: Java的I/O库中使用了适配器模式来适配不同的数据源和数据目的地。例如,InputStreamReader和OutputStreamWriter类充当适配器,它们将字节流转换为字符流。
Java Collections Framework
: Java集合框架中使用了适配器模式来适配不同的集合类型。例如,Collections.synchronizedCollection方法返回一个线程安全的集合视图,它充当适配器,将非线程安全的集合适配为线程安全的集合。
Java XML解析
: Java中解析XML时,可以使用适配器模式来适配不同的XML解析器。例如,SAXParserFactory和DocumentBuilderFactory类充当适配器,它们根据配置选择合适的解析器实现。
Java RMI
(Remote Method Invocation): Java RMI中使用了适配器模式来适配远程对象和本地对象。RMI系统提供的代理类充当适配器,它将远程方法调用转换为本地方法调用。
第三方库和框架
: 许多第三方库和框架也使用适配器模式来集成不同的技术或API。例如,Spring框架中的AopProxy类充当适配器,它将AOP(面向切面编程)的调用转换为目标对象的调用。
4 Spring 哪些地方用到了适配器模式
AOP(面向切面编程)
: Spring AOP使用适配器模式来实现方法拦截。Spring的AopProxy类充当适配器,它根据配置创建代理对象,并在目标对象的方法调用前后执行增强代码。
事件发布
: Spring的事件驱动模型使用适配器模式来解耦事件的生产者和消费者。ApplicationEventMulticaster类充当适配器,它将事件发布给所有注册的监听器。
事务管理
: Spring的事务管理器使用适配器模式来适配不同的事务API。例如,PlatformTransactionManager接口及其各种实现(如DataSourceTransactionManager和JtaTransactionManager)充当适配器,它们将Spring的事务抽象转换为具体的事务处理逻辑。
数据访问
: Spring的数据访问模板(如JdbcTemplate、HibernateTemplate等)使用适配器模式来适配不同的数据访问技术。这些模板类充当适配器,它们将Spring的数据访问抽象转换为具体的数据库操作。
Web集成
: Spring的Web模块使用适配器模式来集成不同的Web框架。例如,DispatcherServlet充当适配器,它将HTTP请求转换为Spring MVC框架的调用。
资源访问
: Spring的ResourceLoader和Resource接口使用适配器模式来抽象不同类型的资源访问。ResourceLoader的实现类充当适配器,它们将资源访问的调用转换为具体文件系统、类路径或URL的访问。
消息服务
: Spring的JMS(Java消息服务)集成使用适配器模式来适配不同的消息中间件。JmsTemplate和JmsListenerContainerFactory类充当适配器,它们将Spring的消息抽象转换为具体的消息中间件操作。