设计模式 - 适配器模式
封面图
•
2025-11-07
•
设计模式
0
0
0
0
适配器模式(Adapter Pattern)是一种**结构型设计模式**,它用于**将一个类的接口转换成客户期望的另一个接口**。适配器模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。 --- ## 一、适配器模式简介 ### 定义: > 将一个类的接口转换成客户希望的另一个接口。适配器让原本不兼容的类可以一起工作。 ### 类型: - **结构型设计模式** ### 使用场景: - 系统需要使用现有的类,但其接口不符合需求。 - 想复用一些没有源码的第三方类库中的类。 - 要将多个不兼容的类统一接口进行调用。 --- ## 二、适配器模式的组成 适配器模式通常包含以下几个角色: 1. **目标接口(Target)** 客户端所使用的接口,定义了客户端需要调用的方法。 2. **被适配者(Adaptee)** 需要被适配的类,它拥有一个与目标接口不兼容的接口。 3. **适配器(Adapter)** 继承或实现目标接口,并持有对被适配者的引用,将被适配者的接口转换为目标接口。 --- ## 三、适配器模式的两种实现方式 ### 1. **类适配器(继承方式)** 通过继承被适配者类并实现目标接口,来完成适配。 ```java // 目标接口 interface MediaPlayer { void play(String audioType, String fileName); } // 被适配者(已有类) class AdvancedMediaPlayer { public void playVlc(String fileName) { System.out.println("Playing VLC: " + fileName); } public void playMp4(String fileName) { System.out.println("Playing MP4: " + fileName); } } // 适配器(继承方式) class MediaAdapter extends AdvancedMediaPlayer implements MediaPlayer { @Override public void play(String audioType, String fileName) { if (audioType.equalsIgnoreCase("vlc")) { playVlc(fileName); } else if (audioType.equalsIgnoreCase("mp4")) { playMp4(fileName); } else { System.out.println("Invalid media type: " + audioType); } } } // 客户端代码 public class Client { public static void main(String[] args) { MediaPlayer player = new MediaAdapter(); player.play("vlc", "test.vlc"); player.play("mp4", "test.mp4"); player.play("avi", "test.avi"); } } ``` ### 2. **对象适配器(组合方式)** 通过在适配器中组合被适配者对象,而不是继承,更加灵活。 ```java // 目标接口 interface MediaPlayer { void play(String audioType, String fileName); } // 被适配者 class AdvancedMediaPlayer { public void playVlc(String fileName) { System.out.println("Playing VLC: " + fileName); } public void playMp4(String fileName) { System.out.println("Playing MP4: " + fileName); } } // 适配器(组合方式) class MediaAdapter implements MediaPlayer { private AdvancedMediaPlayer advancedMediaPlayer; public MediaAdapter(AdvancedMediaPlayer advancedMediaPlayer) { this.advancedMediaPlayer = advancedMediaPlayer; } @Override public void play(String audioType, String fileName) { if (audioType.equalsIgnoreCase("vlc")) { advancedMediaPlayer.playVlc(fileName); } else if (audioType.equalsIgnoreCase("mp4")) { advancedMediaPlayer.playMp4(fileName); } else { System.out.println("Invalid media type: " + audioType); } } } // 客户端代码 public class Client { public static void main(String[] args) { AdvancedMediaPlayer player = new AdvancedMediaPlayer(); MediaPlayer adapter = new MediaAdapter(player); adapter.play("vlc", "test.vlc"); adapter.play("mp4", "test.mp4"); adapter.play("avi", "test.avi"); } } ``` --- ## 四、优点 - **解耦**:将客户端与被适配者分离,提高系统的灵活性和可维护性。 - **复用性**:可以在不修改原有类的情况下复用已有类。 - **扩展性强**:易于添加新的适配器,支持多种不同接口的适配。 --- ## 五、缺点 - **增加系统复杂度**:引入适配器会增加系统的类数量。 - **过度使用**:如果适配器只是为了适应接口,而实际业务逻辑简单,可能会显得多余。 --- ## 六、适用场景举例 - 把旧系统中的类封装成新接口供新系统使用。 - 第三方库中已有类的接口不符合当前项目要求。 - 多个不同接口的设备/服务需要统一接口调用。 --- ## 七、总结 | 项目 | 内容 | |------|------| | 类型 | 结构型设计模式 | | 核心作用 | 接口转换,使不兼容的类能协同工作 | | 实现方式 | 类适配器(继承)、对象适配器(组合) | | 优点 | 解耦、复用、扩展性强 | | 缺点 | 增加复杂度、可能过度设计 | --- 如果你有具体的使用场景或想了解其他设计模式,欢迎继续提问!
上一篇:
设计模式 - 原型模式
下一篇:
设计模式 - 桥接模式
标题录入,一次不能超过6条
留言
评论