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

文章目录

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

相关推荐
数据小爬虫@1 分钟前
Java爬虫实战:深度解析Lazada商品详情
java·开发语言
咕德猫宁丶3 分钟前
探秘Xss:原理、类型与防范全解析
java·网络·xss
F-2H2 小时前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
苹果酱05672 小时前
「Mysql优化大师一」mysql服务性能剖析工具
java·vue.js·spring boot·mysql·课程设计
_oP_i3 小时前
Pinpoint 是一个开源的分布式追踪系统
java·分布式·开源
mmsx3 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
武子康3 小时前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
java·大数据·数据仓库·hive·hadoop·架构
豪宇刘4 小时前
MyBatis的面试题以及详细解答二
java·servlet·tomcat
秋恬意4 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
CIb0la4 小时前
GitLab 停止为中国区用户提供 GitLab.com 账号服务
运维·网络·程序人生