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

文章目录

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

相关推荐
wang_book3 分钟前
redis学习(003 数据结构和通用命令)
java·数据库·redis·学习
英雄汉孑6 分钟前
图片压缩代码和实际操作页面
java
薛·28 分钟前
记一次因ThreadPoolExecutor多线程导致服务器内存压满问题
java·服务器
胡歌_北京分歌40 分钟前
【CentOS 7 上安装 Oracle JDK 8u333】
java·centos
结衣结衣.40 分钟前
完全理解C语言函数
java·linux·c语言·数据库·经验分享·笔记
对许1 小时前
Java操作Excel最佳实践
java·spark·excel
高级程序源1 小时前
springboot学生档案信息管理系统-计算机毕业设计源码96509
java·spring boot·spring·eclipse·mybatis·idea
普通程序员A1 小时前
代码技巧专题 -- 使用策略模式编写HandleService
设计模式·面试·策略模式·代码优化·handle
martian6652 小时前
学懂C#编程:属性(Property)的概念定义及使用详解
java·开发语言·c#·属性·property
阿亮说技术2 小时前
Java毕业设计 基于SSM vue电影院票务系统小程序 微信小程序
java·微信小程序·毕业设计·课程设计