(七)趣学设计模式 之 适配器模式!

news/2025/2/25 11:21:58

在这里插入图片描述

目录


🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解代理模式请看: (六)趣学设计模式 之 代理模式!

这篇文章带你详细认识一下设计模式中的适配器模式

一、 啥是适配器模式

想象一下,你买了一个新的电器 💡,但是插头和家里的插座不匹配 😫,怎么办? 这时候就需要一个插座转换器 🔌,把电器的插头转换成家里的插座可以使用的类型 💡。

适配器模式,就是用来解决接口不兼容的问题! 它可以将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 🤝。

简单来说,就是把不兼容的接口转换成兼容的接口!

  • 你想使用一个类,但是它的接口和你需要的接口不一样: 就像你想用一个旧的类库,但是它的接口和你的代码不兼容 😫!
  • 你想让两个接口不兼容的类一起工作: 就像你想让一个美国的插头和一个中国的插座一起工作 🔌!
  • 你想重用一些现有的类,但是它们的接口不符合你的要求: 就像你想用一个旧的算法,但是它的输入输出格式和你的代码不兼容 😫!

二、 为什么要用适配器模式

适配器模式,好处多多 👍:

  • 提高类的复用性: 可以将一些现有的类适配成新的接口,方便重用 ♻️!
  • 提高系统的灵活性: 可以动态地选择不同的适配器,使得系统更加灵活 🤸!
  • 符合开闭原则: 可以在不修改现有代码的情况下,增加新的适配器,扩展功能 🆕!
  • 解耦: 将客户端和目标类解耦,降低系统的耦合度 🔗!

三、 适配器模式的实现方式

适配器模式主要分为三种:

  • 适配器模式 通过继承来实现适配,就像继承了插座的类 👨‍👩‍👧‍👦!
  • 对象适配器模式 通过组合来实现适配,就像用一个插座转换器 🔌!
  • 接口适配器模式 通过实现一个抽象类来实现适配,就像万能插座 🗜️!

1. 类适配器模式(继承插座 👨‍👩‍👧‍👦)

适配器模式,通过继承来实现适配,就像继承了插座的类,拥有了插座的功能 🔌!

案例:电压适配器(经典案例 ⚡)

假设你有一个 220V 的电源 🔌,但是你需要给一个 5V 的设备充电 📱,怎么办? 这时候就需要一个电压适配器,把 220V 的电压转换成 5V 的电压 ⚡!

代码示例:

// 目标接口:5V 电压
public interface Voltage5V {
    int output5V(); // 输出 5V 电压
}

// 需要适配的类:220V 电压
public class Voltage220V {
    public int output220V() {
        int src = 220;
        System.out.println("我是220V电压");
        return src;
    }
}

// 适配器类:电压适配器
public class VoltageAdapter extends Voltage220V implements Voltage5V {
    @Override
    public int output5V() {
        // 获取 220V 电压
        int srcV = output220V();
        // 转换成 5V 电压
        int dstV = srcV / 44;
        return dstV;
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        VoltageAdapter adapter = new VoltageAdapter(); // 创建适配器对象
        int voltage = adapter.output5V(); // 获取 5V 电压
        System.out.println("输出电压为:" + voltage + "V"); // 输出电压
    }
}

分析:

  • Voltage5V 是目标接口,客户端需要使用 5V 电压。
  • Voltage220V 是需要适配的类,它只能输出 220V 电压。
  • VoltageAdapter 是适配器类,它继承了 Voltage220V 类,并实现了 Voltage5V 接口,将 220V 电压转换成 5V 电压。

输出结果:

我是220V电压
输出电压为:5V

2. 对象适配器模式(插座转换器 🔌)

对象适配器模式,通过组合来实现适配,就像用一个插座转换器,把电器的插头转换成家里的插座可以使用的类型 🔌!

案例:还是电压适配器(对象版⚡)

还是上面的电压适配器的例子,但是这次我们使用对象适配器模式来实现 🚀!

代码示例:

// 目标接口:5V 电压
public interface Voltage5V {
    int output5V(); // 输出 5V 电压
}

// 需要适配的类:220V 电压
public class Voltage220V {
    public int output220V() {
        int src = 220;
        System.out.println("我是220V电压");
        return src;
    }
}

// 适配器类:电压适配器
public class VoltageAdapter implements Voltage5V {
    private Voltage220V voltage220V; // 组合 220V 电压对象

    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int output5V() {
        // 获取 220V 电压
        int srcV = voltage220V.output220V();
        // 转换成 5V 电压
        int dstV = srcV / 44;
        return dstV;
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Voltage220V voltage220V = new Voltage220V(); // 创建 220V 电压对象
        VoltageAdapter adapter = new VoltageAdapter(voltage220V); // 创建适配器对象
        int voltage = adapter.output5V(); // 获取 5V 电压
        System.out.println("输出电压为:" + voltage + "V"); // 输出电压
    }
}

分析:

  • Voltage5V 是目标接口,客户端需要使用 5V 电压。
  • Voltage220V 是需要适配的类,它只能输出 220V 电压。
  • VoltageAdapter 是适配器类,它组合了 Voltage220V 类,并实现了 Voltage5V 接口,将 220V 电压转换成 5V 电压。

输出结果:

我是220V电压
输出电压为:5V

3. 接口适配器模式(万能插座 🗜️)

接口适配器模式,通过实现一个抽象类来实现适配,就像万能插座,可以兼容各种类型的插头 🗜️!

案例:USB 接口适配器(万能接口 💻)

假设你有一个 USB 设备 💾,但是你的电脑只有 Type-C 接口 💻,怎么办? 这时候就需要一个 USB 接口适配器,把 USB 接口转换成 Type-C 接口 💻!

代码示例:

// 目标接口:USB 接口
public interface Usb {
    void read(); // 读取数据
    void write(); // 写入数据
    void connect(); // 连接设备
    void disconnect(); // 断开连接
}

// 抽象适配器类:USB 适配器
public abstract class UsbAdapter implements Usb {
    @Override
    public void read() {
        // 默认实现,可以不实现
    }

    @Override
    public void write() {
        // 默认实现,可以不实现
    }

    @Override
    public void connect() {
        // 默认实现,可以不实现
    }

    @Override
    public void disconnect() {
        // 默认实现,可以不实现
    }
}

// 需要适配的类:Type-C 设备
public class TypeCDevice extends UsbAdapter {
    @Override
    public void read() {
        System.out.println("Type-C 设备读取数据");
    }

    @Override
    public void write() {
        System.out.println("Type-C 设备写入数据");
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        TypeCDevice typeCDevice = new TypeCDevice(); // 创建 Type-C 设备对象
        typeCDevice.connect(); // 连接设备
        typeCDevice.read(); // 读取数据
        typeCDevice.write(); // 写入数据
        typeCDevice.disconnect(); // 断开连接
    }
}

分析:

  • Usb 是目标接口,客户端需要使用 USB 接口。
  • UsbAdapter 是抽象适配器类,它实现了 Usb 接口,但是提供了默认实现,子类可以选择性地实现需要的方法。
  • TypeCDevice 是需要适配的类,它继承了 UsbAdapter 类,并实现了 readwrite 方法,实现了 USB 接口的功能。

输出结果:

Type-C 设备读取数据
Type-C 设备写入数据

四、 三种适配器的对比

特性适配器模式对象适配器模式接口适配器模式
实现方式继承组合抽象类
优点简单易用灵活,可以适配多个类可以选择性地实现接口方法
缺点只能适配一个类,耦合度较高需要持有目标类的对象,增加了对象的数量需要定义抽象类,增加了类的数量
适用场景目标类接口比较稳定,不需要经常修改需要适配多个类,或者目标类接口经常修改只需要使用接口中的部分方法

五、 适配器模式的优缺点

优点:

  • 提高类的复用性 ♻️!
  • 提高系统的灵活性 🤸!
  • 符合开闭原则 🆕!
  • 解耦 🔗!

缺点:

  • 增加了系统的复杂度 😫!
  • 可能会降低性能 🐌!

六、 适配器模式的应用场景

  • 接口转换: 将一个类的接口转换成客户希望的另外一个接口 🔌!
  • 数据转换: 将一种格式的数据转换成另外一种格式的数据 🗂️!
  • 遗留系统集成: 将新的系统和旧的系统集成在一起 🤝!
  • 第三方库集成: 将第三方库集成到你的项目中 📚!

七、 总结

  • 适配器模式就像插座转换器,让不兼容的接口也能愉快玩耍! 🔌
  • 主要分为类适配器模式、对象适配器模式和接口适配器模式三种! 🤸
  • 优点是提高类的复用性、提高系统的灵活性、符合开闭原则、解耦! 👍
  • 缺点是增加复杂度、可能降低性能! 👎
  • 适用于需要解决接口不兼容的问题的场景! 🎯

希望这篇文章能让你彻底理解适配器模式! 💯 祝你学习愉快! 😄
看完请看:(八)趣学设计模式 之 装饰器模式!


http://www.niftyadmin.cn/n/5865431.html

相关文章

Spring Security面试题

Spring Security面试题 基础概念 Q1: Spring Security的核心功能有哪些? public class SecurityBasicDemo {// 1. 基本配置public class SecurityConfigExample {public void configDemo() {ConfigurationEnableWebSecuritypublic class SecurityConfig extends …

1. EXCEL基础、界面介绍《AI赋能Excel 》

欢迎来到滔滔讲AI。 Excel表格是一种强大的电子表格软件,它不仅可以用来存储和组织数据,还可以进行复杂的计算、数据分析和可视化。无论是在工作,学习,还是日常生活中,Excel都经常用到,帮助人们管理和分析大量数据,做出…

【附源码】基于opencv+pyqt5搭建的人脸识别系统

文章目录 前言一、人脸检测二、人脸识别1.训练识别器2.识别人脸 三、界面相关1.Qlabel展示图片2.表格跟随内容而增加和减少3.选择图片文件4.警告框 四、源码获取总结 前言 人脸识别技术作为人工智能领域的一颗璀璨明珠,正逐渐渗透到我们生活的每一个角落&#xff0…

一周掌握Flutter开发--2、状态管理

文章目录 状态管理核心问题必学方案2.1 简单场景:StatefulWidget setState2.2 复杂场景:Provider、Riverpod、Bloc 或 GetX2.3 理解 InheritedWidget 和 ValueNotifier 的原理 总结 状态管理 状态管理是 Flutter 开发中的核心问题之一,尤其…

python 判断 字符串在字典列表中 并获取对应字典

在Python中,如果你想判断一个字符串是否存在于一个字典列表中,并获取对应的字典,你可以使用多种方法。下面是一些常见的方法来实现这个功能: 方法1:使用列表推导式和any() 如果你想要检查字符串是否存在于字典列表中的…

【ECMAScript6】

【ECMAScript6】 01. ES6介绍02. let和const命令03. 模板字符串04. 函数之默认值、剩余参数05. 函数之扩展运算符、箭头函数06. 箭头函数this指向和注意事项07. 解构赋值08. 扩展的对象的功能(简写)09. Symbol类型10. Set集合数据类型11. Map数据类型12.…

java23种设计模式-组合模式

组合模式(Composite Pattern)学习笔记 🌟 定义 组合模式属于结构型设计模式,用于将对象组合成树形结构以表示"部分-整体"层次结构。它使得用户对单个对象和组合对象的使用具有一致性。 🎯 适用场景 需要表…

Docker(Nginx)部署Vue

简介:目标使用docker将vue生成的dist文件,结合nginx生成镜像,然后运行; 1、首选确保vue项目正确运行,并能正确打包dist文件; 2、查看已经生成的dist文件 3、将dist文件打包为rar文件或者zip文件&#xf…