什么是适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个接口转换为客户希望的另一个接口,目的是使原本由于接口不兼容而无法一起工作的类能够协同工作。适配器模式涉及到的角色主要有三个:目标接口(Target Interface)、被适配者(Adaptee)和适配器(Adapter)。适配器类(Adapter Class)通过继承或组合的方式实现了目标接口,并负责将被适配者的接口转换为目标接口期望的行为。

以下是一个简单的Java示例,假设我们有一个老式的音频播放器接口(OldMediaPlayer),而我们现在需要将其与一个新的音响系统(SpeakerSystem)配合,但音响系统只接受实现了AdvancedMediaPlayer接口的播放器。这时就可以使用适配器模式来实现接口的适配。

首先,定义原有的老式播放器接口:

// 老式播放器接口
public interface OldMediaPlayer {
    void playVlc(String fileName);
    void playMp4(String fileName);
}

// 老式播放器实现
public class OldMediaPlayerImpl implements OldMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing VLC file: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing MP4 file: " + fileName);
    }
}

接下来,定义新的播放器接口:

// 新的高级播放器接口
public interface AdvancedMediaPlayer {
    void play(String audioType, String fileName);
}

然后创建适配器类,使其既实现了老式播放器接口,又实现了新的高级播放器接口:

// 适配器类,实现新的播放器接口,内部持有一个老式播放器实例
public class OldMediaPlayerAdapter implements AdvancedMediaPlayer {
    private OldMediaPlayer oldPlayer;

    public OldMediaPlayerAdapter(OldMediaPlayer player) {
        this.oldPlayer = player;
    }

    @Override
    public void play(String audioType, String fileName) {
        if ("vlc".equalsIgnoreCase(audioType)) {
            oldPlayer.playVlc(fileName);
        } else if ("mp4".equalsIgnoreCase(audioType)) {
            oldPlayer.playMp4(fileName);
        } else {
            System.out.println("Invalid media. Supported types: vlc, mp4");
        }
    }
}

最后,音响系统可以与实现了AdvancedMediaPlayer接口的适配器类一起工作:

// 音响系统类
public class SpeakerSystem {
    public void play(AdvancedMediaPlayer advancedMediaPlayer, String audioType, String fileName) {
        advancedMediaPlayer.play(audioType, fileName);
    }
}

// 主函数中使用适配器
public class Main {
    public static void main(String[] args) {
        OldMediaPlayer oldPlayer = new OldMediaPlayerImpl();
        
        // 创建适配器并将老式播放器适配为新的接口
        AdvancedMediaPlayer adapter = new OldMediaPlayerAdapter(oldPlayer);
        
        // 音响系统现在可以与适配过的老式播放器协作
        SpeakerSystem speaker = new SpeakerSystem();
        speaker.play(adapter, "vlc", "myFile.vlc");
        speaker.play(adapter, "mp4", "myMovie.mp4");
    }
}

在上述示例中,OldMediaPlayerAdapter扮演了适配器的角色,它通过实现AdvancedMediaPlayer接口并持有OldMediaPlayer的实例,将老式播放器的接口转换为音响系统期望的接口。这样,即使老式播放器接口与音响系统所需接口不一致,也能通过适配器顺利协同工作。

相关推荐

  1. 什么适配器模式

    2024-04-01 18:12:01       45 阅读
  2. 什么适配器模式?它的实现方式有哪些?

    2024-04-01 18:12:01       53 阅读
  3. 适配器模式

    2024-04-01 18:12:01       43 阅读
  4. 适配器模式

    2024-04-01 18:12:01       45 阅读
  5. 适配器模式

    2024-04-01 18:12:01       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-01 18:12:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-01 18:12:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-01 18:12:01       82 阅读
  4. Python语言-面向对象

    2024-04-01 18:12:01       91 阅读

热门阅读

  1. 北京2024年注册技术咨询公司新材料与流程全攻略

    2024-04-01 18:12:01       26 阅读
  2. 【 自动化构建 】深入前端脚手架实现原理

    2024-04-01 18:12:01       29 阅读
  3. python爬虫下载音乐

    2024-04-01 18:12:01       31 阅读
  4. PHP反序列化

    2024-04-01 18:12:01       37 阅读
  5. 基于单片机控制的高速数据采集与处理系统研究

    2024-04-01 18:12:01       33 阅读
  6. 蓝桥杯单片机第九届国赛——多功能测量仪表

    2024-04-01 18:12:01       31 阅读
  7. C++20之Concept

    2024-04-01 18:12:01       28 阅读
  8. leetCode-01

    2024-04-01 18:12:01       27 阅读
  9. 前端:用Sass简化媒体查询

    2024-04-01 18:12:01       35 阅读
  10. RSS 一种简洁优雅的数据订阅方式

    2024-04-01 18:12:01       36 阅读
  11. 程序员常用的几种算法

    2024-04-01 18:12:01       26 阅读
  12. 算法—递归逆序栈、排序栈

    2024-04-01 18:12:01       29 阅读