广西建设厅办事大厅网站,咸阳做网站,做网站设计的,网站开发公司方案报价适配器模式#xff08;Adapter Pattern#xff09;详解
适配器模式#xff08;Adapter Pattern#xff09;是一种结构型设计模式#xff0c;它的主要作用是将一个类的接口转换成客户端期望的另一个接口#xff0c;使原本由于接口不兼容而无法一起工作的类可以协同工作。…适配器模式Adapter Pattern详解
适配器模式Adapter Pattern是一种结构型设计模式它的主要作用是将一个类的接口转换成客户端期望的另一个接口使原本由于接口不兼容而无法一起工作的类可以协同工作。适配器模式通常被用来修复已有代码的兼容性问题尤其是在重用现有类时避免大规模修改代码。
1. 适配器模式的定义
1.1 什么是适配器模式
适配器模式将 不兼容的接口 进行适配使得原本不兼容的类能够在一起工作。它就像生活中的电源适配器可以让不同国家的电器设备在本国的电网环境下正常工作。
1.2 适配器模式的特点
转换接口将一个类的接口转换为客户端所期望的另一个接口。兼容性解决接口不兼容的问题让原本无法协作的类能够协同工作。封装旧接口适配器模式常用于将旧系统的接口封装起来以便与新系统兼容。
2. 适配器模式的结构
适配器模式通常包含以下几个角色
Target目标接口 客户端期望使用的接口。Adaptee被适配者 需要适配的类其接口与目标接口不兼容。Adapter适配器 将被适配者的接口转换为目标接口的一个包装类。Client客户端 使用目标接口的类。
类图 -------------| Target |--------------------------------- || request() | |------------- |^ || |-------------- ----------------| Adapter |---------| Adaptee |-------------- ----------------| request() | | specificRequest() |-------------- ----------------3. 适配器模式的分类
适配器模式有两种主要实现方式
类适配器Class Adapter 使用继承来实现适配器。适配器类继承自 Adaptee 和 Target。由于 Java 只支持单继承因此在 Java 中类适配器使用场景较少。对象适配器Object Adapter 使用组合来实现适配器。适配器类持有一个 Adaptee 对象的引用。这种方式更加灵活是推荐的实现方式。
4. 适配器模式的实现
为了更好地理解适配器模式我们使用一个简单的示例来演示其工作原理。假设我们有一个 AudioPlayer 类它只能播放 .mp3 文件现在我们希望它也能播放 .mp4 和 .vlc 文件。
4.1 Java 示例代码对象适配器
// 目标接口
interface MediaPlayer {void play(String audioType, String fileName);
}// 被适配者类支持 VLC 播放
class VlcPlayer {public void playVlc(String fileName) {System.out.println(播放 VLC 文件: fileName);}
}// 被适配者类支持 MP4 播放
class Mp4Player {public void playMp4(String fileName) {System.out.println(播放 MP4 文件: fileName);}
}// 适配器类
class MediaAdapter implements MediaPlayer {private VlcPlayer vlcPlayer;private Mp4Player mp4Player;public MediaAdapter(String audioType) {if (audioType.equalsIgnoreCase(vlc)) {vlcPlayer new VlcPlayer();} else if (audioType.equalsIgnoreCase(mp4)) {mp4Player new Mp4Player();}}Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase(vlc)) {vlcPlayer.playVlc(fileName);} else if (audioType.equalsIgnoreCase(mp4)) {mp4Player.playMp4(fileName);}}
}// 具体目标类
class AudioPlayer implements MediaPlayer {private MediaAdapter mediaAdapter;Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase(mp3)) {System.out.println(播放 MP3 文件: fileName);} else if (audioType.equalsIgnoreCase(vlc) || audioType.equalsIgnoreCase(mp4)) {mediaAdapter new MediaAdapter(audioType);mediaAdapter.play(audioType, fileName);} else {System.out.println(不支持的文件格式: audioType);}}
}// 测试客户端
public class AdapterPatternDemo {public static void main(String[] args) {AudioPlayer audioPlayer new AudioPlayer();audioPlayer.play(mp3, 歌曲.mp3);audioPlayer.play(mp4, 电影.mp4);audioPlayer.play(vlc, 动画.vlc);audioPlayer.play(avi, 短片.avi);}
}输出结果
播放 MP3 文件: 歌曲.mp3
播放 MP4 文件: 电影.mp4
播放 VLC 文件: 动画.vlc
不支持的文件格式: avi5. 适配器模式的应用场景
适配器模式适合以下场景
希望复用一些现有的类但是类的接口不符合当前系统的需求。想要封装一些旧系统的类以便在新系统中使用。使用第三方库而其接口与项目中定义的接口不兼容。希望创建一个可复用的类使其能够与不相关或不可预见的类协同工作。
6. 适配器模式的优缺点
6.1 优点
提高类的复用性通过适配器模式现有类可以与其他类进行协作而无需修改原始类的代码。提高类的灵活性和扩展性通过引入适配器类可以在不修改现有代码的情况下增加新功能。解耦目标类与被适配者类适配器将目标类和被适配者类隔离开来实现了解耦。
6.2 缺点
增加系统复杂度引入适配器后系统会增加额外的适配器类导致复杂度增加。不易理解尤其是系统中存在大量适配器时可能会导致代码难以理解和维护。类适配器的实现受限于继承在 Java 中类适配器受限于单继承的特性因此更推荐使用对象适配器。
7. 适配器模式的扩展
7.1 双向适配器
适配器模式可以实现双向适配即适配器不仅能够将被适配者转化为目标接口也能将目标接口转化为被适配者接口。
7.2 缺省适配器Default Adapter
适用于接口中有多个方法时想要简化接口的实现。通常通过创建一个抽象类该抽象类提供这些方法的默认实现具体类只需重写需要的方法。
8. 适配器模式的实际应用
Java I/O 类库 Java 的 InputStreamReader 和 OutputStreamWriter 就是典型的适配器模式用于在字节流和字符流之间进行适配。数据库连接 JDBC 中的 DriverManager 使用适配器模式来适配不同的数据库驱动程序。Spring 框架 Spring 的 HandlerAdapter 适配器用于将不同类型的请求处理器如 Controller、HttpRequestHandler适配成统一的处理方式。
9. 总结
适配器模式是一种非常有用的设计模式尤其是在需要与现有系统集成时。通过适配器模式可以有效地复用现有代码同时保持系统的灵活性和扩展性。
优点提高复用性、解耦、增加灵活性。缺点增加复杂度、不易理解。适用场景复用现有类、封装旧系统、使用第三方库。