设计模式——适配器模式

设计模式------适配器模式

目录

介绍

适配器模式(Adapter Pattern)是一种结构型设计模式,目的是将一个类的接口转换成客户端所期望的另一个接口。适配器模式让原本接口不兼容的类可以一起工作。

简单来说,适配器模式就是提供一个中介者,使得两个原本不能直接交互的接口可以通过适配器实现兼容和交互。

就像不同国家的插座标准一样,比如说,欧洲国家的插座标准不能满足中式插头电器的正常使用,那么就需要一个欧转中的转换头,使得中式插头的电器可以正常使用。适配器就是这个道理

实现

结构

在适配器模式中,涉及到以下几个角色:

  1. 目标接口(Target):客户端所期待的接口,适配器将要将其适配成这个接口。
  2. 客户端(Client):使用目标接口的类,通常是调用方。
  3. 源接口(Adaptee):需要适配的现有接口。
  4. 适配器(Adapter):实现目标接口,内部持有一个源接口实例并将其转换成目标接口需要的形式。

类适配器模式(通过继承)

类适配器模式通过继承源类来适配目标接口。这种方式会导致适配器必须继承源类,所以适配器类无法继承其他类。

示例代码:

java 复制代码
// 目标接口(客户端期望的接口)
interface Target {
    void request();
}

// 源接口(需要被适配的接口)
class Adaptee {
    public void specificRequest() {
        System.out.println("Specific request.");
    }
}

// 适配器(继承自Adaptee类并实现Target接口)
class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        specificRequest();  // 调用源类的方法
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Target target = new Adapter();  // 客户端通过目标接口来使用
        target.request();  // 输出: Specific request.
    }
}

简单解释一下,我们需要将现有接口specificRequest() 适配成 request(),也就是说,客户端希望通过调用 request()方法来达到调用specificRequest()方法,通过以上类的继承与实现,可以轻松解决这个需求

对象适配器模式(通过委托)

对象适配器模式通过持有一个源类的实例并调用该实例的相应方法来实现适配。这样适配器类可以继承自其他类。

示例代码:

  1. 目标接口(客户端期望的接口)

    java 复制代码
    // 目标接口(客户端期望的接口)
    interface Target {
        void request();
    }
  2. 源接口(需要被适配的接口)

    java 复制代码
    // 源接口(需要被适配的接口)
    class Adaptee {
        public void specificRequest() {
            System.out.println("Specific request.");
        }
    }
  3. 适配器

    java 复制代码
    // 适配器(通过持有Adaptee实例来适配)
    class Adapter implements Target {
        private Adaptee adaptee;
    
        public Adapter(Adaptee adaptee) {
            this.adaptee = adaptee;
        }
    
        @Override
        public void request() {
            adaptee.specificRequest();  // 委托给Adaptee实例
        }
    }
  4. 客户端(测试代码)

    java 复制代码
    // 客户端
    public class Client {
        public static void main(String[] args) {
            Adaptee adaptee = new Adaptee();
            Target target = new Adapter(adaptee);  // 客户端通过目标接口来使用
            target.request();  // 输出: Specific request.
        }
    }

简单解释一下,这里适配器通过持有一个源接口的实例,来实现解除类适配器模式中的继承关系,其在正常保证适配器的功能的前提下,增强了适配器的扩展性

优缺点

优点:

  1. 解耦:客户端与源类之间的依赖被适配器解耦,客户端只关心目标接口,不关心源类的实现细节。
  2. 提高复用性:可以将已有类的功能适配到新接口,使其复用性更强。
  3. 灵活性高:适配器模式提供了灵活的适配方式,既可以通过继承也可以通过组合来实现。

缺点:

  1. 增加系统复杂性:引入适配器可能导致系统结构更为复杂,尤其是在大量使用适配器的情况下。
  2. 性能开销:适配器需要转发方法调用,可能导致一定的性能开销,尤其是在高频调用的场景中。

使用场景

适配器模式通常在以下情况中使用:

  • 你希望复用一个已有的类,但它的接口不符合你所需要的。
  • 你需要将一个类的接口转换成你所期望的接口。
  • 类之间存在较大的接口差异,你希望通过一个中间层来解决。

例如:当你使用一个已有的库,但这个库的接口和你现有的代码不兼容时,适配器模式就非常适用。

总结

适配器模式是一种常见的设计模式,它通过在不同接口之间提供一个桥梁,使得不兼容的接口能够协同工作。其常见用途包括适配第三方库、系统重构时对旧代码的兼容等场景。适配器模式的核心思想就是将客户端的期望接口和源类的实际接口解耦,让它们能够顺利交互。通过使用适配器模式,可以在不改变现有代码的基础上使不同系统组件协同工作,提高系统的灵活性和可维护性。

相关推荐
S01d13r4 分钟前
2024 蓝桥杯 Java 研究生组
java·职场和发展·蓝桥杯
江节胜-胜行全栈AI5 分钟前
Java-对比两组对象找出发生变化的字段工具-支持枚举映射-支持时间-支持显示对应字段中文描述-嵌套list等场景
java·python·list
Dcs5 分钟前
使用 Nebius 在几分钟内微调你的 LLM
java
cg501718 分钟前
Maven 的安装与配置(IDEA)
java·ide·spring boot·maven
写bug写bug27 分钟前
掌握Spring 中的 RestTemplate
java·后端·spring
麓殇⊙34 分钟前
springMVC-拦截器详解
java·后端·spring·interceptor
li_Michael_li43 分钟前
Spring Boot中@Valid 与 @Validated 注解的详解
java·spring boot·后端
添砖Java中1 小时前
Java接口性能优化面试问题集锦:高频考点与深度解析
java·面试·性能优化
风铃儿~1 小时前
Redis过期key处理、内存淘汰策略与缓存一致性策略实践方案
java·数据结构·redis·微服务
橘猫云计算机设计1 小时前
基于springboot钻孔数据管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·信息可视化·汽车·毕业设计