十一、【结构型模式】适配器模式(Adapter)

设计模式系列专栏【持续更新中,工作日更新,周末要休息】

1、介绍

适配器模式的产生,主要是为了解决在软件系统中,对于一些类,它们的接口并不能满足我们的需求,或者我们希望将一个类的接口转换为另一个我们需要的接口。例如,我们在使用一个第三方库时,它提供的API和我们的系统不兼容,或者在一个老系统中,由于历史原因,我们需要将旧的接口转换为新的接口。

适配器模式就像是一个电源适配器,将插头转换为我们电源插座可以接受的类型。如果没有电源适配器,我们可能需要更换设备的电源线或者更换整个设备,这无疑会带来额外的成本和麻烦。而有了电源适配器,我们只需要将它连接到设备和电源插座之间,就可以解决问题。

适配器模式就是这样一种设计模式,它可以将一个类的接口转换为客户期望的另一个接口,使得原本因接口不兼容不能一起工作的那些类可以一起工作。在许多软件系统中,当我们需要集成第三方库,或者需要在新旧系统之间进行过渡时,适配器模式都是一种非常实用的解决方案。

2、生活实例

想象一下,你从美国去欧洲旅行,带了一堆电子设备。但在欧洲,你发现你的充电器无法插入墙壁插座,因为插头的形状不同。此时,你需要一个插头转换器(也就是电源适配器)来解决问题。这个插头转换器就像一个适配器,它在你的充电器和墙壁插座之间起到桥梁的作用,让它们可以一起工作。

3、java代码实例

在这个示例中,假设我们有一个现有的 MediaPlayer 接口和一个实现了 MediaPlayer 接口的 AudioPlayer 类。现在,我们希望 AudioPlayer 也能播放其他格式的音频,比如 mp4 和 vlc,但我们不想修改 AudioPlayer 的代码。

首先,我们创建一个 AdvancedMediaPlayer 接口,它定义了播放 vlc 和 mp4 格式的方法。

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

然后,我们创建两个实现了 AdvancedMediaPlayer 接口的类 VlcPlayer 和 Mp4Player。

public class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {
        // Do nothing
    }
}

public class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        // Do nothing
    }

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

接下来,我们创建一个 MediaPlayer 接口的适配器类 MediaAdapter,让它也可以使用 AdvancedMediaPlayer 的功能。

public class MediaAdapter implements MediaPlayer {
    AdvancedMediaPlayer advancedMediaPlayer;

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

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

最后,我们在 AudioPlayer 类中使用 MediaAdapter,使它可以播放所有格式的音频。

public class AudioPlayer implements MediaPlayer {
    MediaAdapter mediaAdapter;

    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp3")) {
            System.out.println("Playing mp3 file. Name: " + fileName);
        } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
            mediaAdapter = new MediaAdapter(audioType);

 mediaAdapter.play(audioType, fileName);
        } else {
            System.out.println("Invalid media. " + audioType + " format not supported");
        }
    }
}

现在,AudioPlayer 可以播放 mp3、mp4 和 vlc 格式的音频了,而且我们并没有修改 AudioPlayer 的源代码。

Last Updated: 2024/09/12 06:35:57
最大化利用公网ip方案记录 钉钉ngrok+自己的服务器内网穿透
OωO 取消
  • |´・ω・)ノ
  • ヾ(≧∇≦*)ゝ
  • (☆ω☆)
  • (╯‵□′)
  •  ̄﹃ ̄
  • (/ω\)
  • →_→
  • (ノ°ο°)ノ
  • ⌇●﹏●⌇
  • (ฅ´ω`ฅ)
  • φ( ̄∇ ̄o)
  • ヾ(´・ ・`。)ノ"
  • (ó﹏ò。)
  • Σ(っ °Д °;)っ
  • ( ,,´・ω・)ノ
  • ╮(╯▽╰)╭
  • (。•ˇ‸ˇ•。)
  • >﹏<
  • ( ๑´•ω•)
  • "(´っω・`。)
  • "(ㆆᴗㆆ)