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

一、概念

就像电源适配器一样,让手里的两孔插头可以用在目标三孔插座上,两孔插头→电源适配器→三孔插座。

1.1 两种实现方式

Target 目标接口/抽象类、Adaptee 现有的类/接口、Adapter 适配器类。

|---------------------|-----------------------------------------------------------------------------------------------------------------|
| 类适配器 (通过继承,不推荐) | 适配器类 继承 适配者 并实现目标接口,不推荐因为只能单继承就要求目标必须是接口而不能是多个抽象类,适配器实例还能调用适配者的老方法,想要屏蔽的话后期修改已有类的成员权限是不可取的,甚至 Kotlin 的类默认不允许继承。 |
| 对象适配器 (通过组合) | 适配器类实现目标接口,内部创建适配者实例去做事。 |
| 接口适配 (通过空实现) | 目标接口中的方法过多,适配器类实现目标接口,不需要的抽象方法使用空实现。 |

1.2 Android 使用场景

|-----------|-----------------------------------------------------------------------------------------------------------|
| 列表视图适配 | ListView/RecyclerView的Adapter(如ArrayAdapter、BaseAdapter)是典型应用,将数据源(List/ 数组)适配到列表视图的显示接口,隔离数据与UI。 |
| 第三方库兼容 | 将Glide/Picasso的图片加载接口适配到项目统一的ImageLoader接口,便于后续替换图片加载库(如从Glide切换到Coil时只需修改适配器)。 |
| 旧系统接口迁移 | 将遗留的HttpURLConnection网络请求逻辑适配到新项目的RetrofitService接口,无需重写旧有稳定代码。 |
| Java IO 流 | InputStreamReader 是字节流到字符流的适配器,Reader reader = new InputStreamReader(inputStream, "UTF-8"),将字节流转为字符流的适配器。 |

二、实现

2.1 对象适配器

Kotlin 复制代码
//目标接口
interface IMediaPlayer {
    fun playMedia(miediaType: String)
}
//适配者(也可以是个类)
interface IMp3Player {
    fun playMp3()
}
//适配器
class MediaAdapter() : MediaPlayer {
    //持有适配者实例
    private val mp3Player: IMp3Player by lazy { Mp3PlayerImpl() }
    //实现新接口功能,调用旧接口方法,提供其它补全
    override fun playMedia(miediaType: String) = when (miediaType) {
        "mp3" -> mp3Player.playMp3()
        "mp4" -> println("播放mp4")
        else -> println("播放其它")
    }
}
//使用
MediaAdapter().playMedia("mp4")

2.2 接口适配器

Kotlin 复制代码
interface Function {
    fun f1()
    fun f2()
    fun f3()
}

interface FunctionAdapter : Function {
    //需要的可以不实现
    //不需要的提供空实现
    override fun f2() {}
    override fun f3() {}
}

class FunctionImpl : FunctionAdapter {
    override fun f1() { println("f1") }
}

fun main() {
    FunctionImpl().f1()
    FunctionImpl().f2() //还是能调用空实现
}
相关推荐
云上凯歌19 分钟前
02 Spring Boot企业级配置详解
android·spring boot·后端
hqiangtai28 分钟前
Android 高级专家技术能力图谱
android·职场和发展
aqi0040 分钟前
FFmpeg开发笔记(九十七)国产的开源视频剪辑工具AndroidVideoEditor
android·ffmpeg·音视频·直播·流媒体
stevenzqzq1 小时前
Android Koin 注入入门教程
android·kotlin
炼金术1 小时前
SkyPlayer v1.1.0 - 在线视频播放功能更新
android·ffmpeg
用户276038157811 小时前
鲲鹏+昇腾:开启 AI for Science 新范式——基于PINN的流体仿真加速实践
android
此去正年少2 小时前
编写adb脚本工具对Android设备上的闪退问题进行监控分析
android·adb·logcat·ndk·日志监控
落羽凉笙2 小时前
Python基础(4)| 玩转循环结构:for、while与嵌套循环全解析(附源码)
android·开发语言·python
十幺卜入3 小时前
Unity3d C# 基于安卓真机调试日志抓取拓展包(Android Logcat)
android·c#·unity 安卓调试·unity 安卓模拟·unity排查问题
frontend_frank3 小时前
脱离 Electron autoUpdater:uni-app跨端更新:Windows+Android统一实现方案
android·前端·javascript·electron·uni-app