本文介绍: 这篇教程不仅提供了适配器模式的理论基础,还通过具体的Java代码示例展示如何实现应用这种模式简单理解,通俗易懂

引言

我们日常生活中,适配器无处不在:无论是将不同国家的插头转换本地标准,还是连接新型耳机传统音频端口,适配器在我们生活中扮演着重要角色。同样,在软件开发领域,适配器模式也扮演着类似的角色,帮助不兼容接口实现协同工作。想象一下,如果你有两个组件,它们功能强大,但因为接口匹配而无法一起工作,该怎么办?适配器模式这里就像是一个功能转换插头,连接这些组件,让它们可以协同工作

适配器模式简介

适配器模式是一种结构设计模式,它允许你将一个类的接口转换客户端期望的另一种接口。适配器模式使得原本由于接口兼容而不能一起工作的类可以协同工作。

定义与用途:

  1. 适配器模式主要用于解决两个已有接口之间不匹配问题,无需修改现有的代码
  2. 它常用于系统升级整合过程中,特别是在需要整合第三方库或遗留系统时。

实现方式

通过将类的实例过程客户端代码转移到工厂类,从而减少客户端复杂性。
适配器模式通常通过创建一个包装类,这个包装类持有一个对已有类的引用,并实现目标接口。

类型

适配器模式主要有两种类型

使用场景

适配器模式在以下情况下非常有用:

优势与劣势

适配器模式在Spring中的应用

Spring框架中广泛应用了适配器模式,尤其在Spring MVC框架中。Spring用适配器模式来兼容不同类型的控制器实现。

HandlerAdapter:在Spring MVC中,HandlerAdapter 负责将多种类型的请求
处理器(如Controller接口、HttpRequestHandler和SimpleControllerHandlerAdapter)
适配为一个统一处理流程视图适配器:Spring MVC使用视图适配器将不同的视图技术(如JSP、
Freemarker、
Thymeleaf整合到同一模型中,使得控制器可以透明使用它们。

数据访问适配器:Spring通过数据访问适配器简化了对不同数据源访问,
如JDBC、Hibernate、JPA等,使得业务逻辑可以从具体的数据访问技术中解耦。

多媒体播放器示例

在这个示例中,我们有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的具体类 AudioPlayer。AudioPlayer 默认可以播放 mp3 格式音频文件

我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的具体类。这些类可以播放 vlcmp4 格式文件

我们希望 AudioPlayer 也能播放其他格式音频。为了实现这一点,我们创建了一个适配器类 MediaAdapter,它实现了 MediaPlayer 接口,并使用 AdvancedMediaPlayer 对象播放所需的格式

AudioPlayer 使用适配器类 MediaAdapter 并传递它所需的音频类型,而不需要知道实际上哪个类可以播放所需的格式。AdapterPatternDemo(我们的演示类)将使用 AudioPlayer 类来播放各种格式音频

在这里插入图片描述
步骤 1:
创建媒体播放器高级媒体播放器的接口。

public interface MediaPlayer {

    public void play(String audioType, String fileName);

}
public interface AdvancedMediaPlayer {
    public void playVlc(String fileName);
    public void playMp4(String fileName);
}

步骤 2:
创建实现 AdvancedMediaPlayer 接口的具体类。

public class VlcPlayer implements AdvancedMediaPlayer{

    @Override
    public void playVlc(String fileName) {
        System.out.println("播放 VLC 文件名称: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {
        // 无操作
    }

}
public class Mp4Player implements AdvancedMediaPlayer {

    @Override
    public void playVlc(String fileName) {
        // 无操作
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("播放 MP4 文件名称: " + fileName);
    }

}

步骤 3:
创建实现 MediaPlayer 接口的适配器类。

public class MediaAdapter implements MediaPlayer{
    AdvancedMediaPlayer advancedMusicPlayer;

    public MediaAdapter(String audioType){
        if(audioType.equalsIgnoreCase("vlc") ){
            advancedMusicPlayer = new VlcPlayer();
        } else if (audioType.equalsIgnoreCase("mp4")){
            advancedMusicPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String audioType, String fileName) {
        if(audioType.equalsIgnoreCase("vlc")){
            advancedMusicPlayer.playVlc(fileName);
        } else if(audioType.equalsIgnoreCase("mp4")){
            advancedMusicPlayer.playMp4(fileName);
        }
    }
}

步骤 4:
创建实现 MediaPlayer 接口的具体类。

public class AudioPlayer implements MediaPlayer {

    MediaAdapter mediaAdapter;

    @Override
    public void play(String audioType, String fileName) {
        // 内置支持播放 mp3 音乐文件
        if(audioType.equalsIgnoreCase("mp3")){
            System.out.println("播放 mp3 文件名称: " + fileName);
        }
        // mediaAdapter 提供支持播放其他文件格式
        else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        }
        else {
            System.out.println("无效媒体。" + audioType + " 格式支持");
        }
    }

}

步骤 5:
使用 AudioPlayer 来播放不同类型的音频格式

public class AdapterPatternDemo {
    public static void main(String[] args) {
        AudioPlayer audioPlayer = new AudioPlayer();

        audioPlayer.play("mp3", "beyond the horizon.mp3");
        audioPlayer.play("mp4", "alone.mp4");
        audioPlayer.play("vlc", "far far away.vlc");
        audioPlayer.play("avi", "mind me.avi");
    }
}

在这里插入图片描述

代码地址

23种设计模式相关代码后续会逐步提交github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern

原文地址:https://blog.csdn.net/qq_33129875/article/details/134727351

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_23260.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注