设计模式——适配器模式

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

目录

介绍

适配器模式(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. 性能开销:适配器需要转发方法调用,可能导致一定的性能开销,尤其是在高频调用的场景中。

使用场景

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

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

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

总结

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

相关推荐
reddingtons5 小时前
【游戏宣发】PS “生成式扩展”流,30秒无损适配全渠道KV
游戏·设计模式·新媒体运营·prompt·aigc·教育电商·游戏美术
李慕婉学姐5 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
奋进的芋圆7 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin7 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model20057 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
荒诞硬汉8 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国8 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_941882488 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈9 小时前
两天开发完成智能体平台
java·spring·go
alonewolf_999 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc