【设计模式】适配器模式(结构型)⭐⭐⭐

文章目录

  • 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的消息抽象转换为具体的消息中间件操作。

相关推荐
暗黑起源喵3 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong7 分钟前
Java反射
java·开发语言·反射
九圣残炎41 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge43 分钟前
Netty篇(入门编程)
java·linux·服务器
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐1 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。1 小时前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野1 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航1 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
confiself2 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言