Skip to content

适配器

字数: 0 字 时长: 0 分钟

简介

适配器模式(Adapter Pattern)核心思想是:通过创建一个中间层(适配器),将一个类的接口转换为客户期望的另一个接口

UML 类图

adapter.webp

  • 目标接口(Target):客户端希望使用的接口
  • 适配器(Adapter):实现了目标接口,通过委托的方式将请求转换为适配的接口调用
  • 被适配者(Adaptee):需要被适配的已有组件

实现示例

以改造老的播放接口适配新的多格式播放接口为例:

java
// 1. 目标接口 (多格式播放播放器)
interface AudioPlayer {
    void play(String audioType, String fileName);
}

// 2. 被适配者(已有实现)
interface OldPlayer {
    void play(String fileName);
}
class Mp4Player implements OldPlayer{
    @Override
    public void play(String fileName) {
        System.out.println("播放 mp4 文件: " + fileName);
    }
}
class Mp3Player implements OldPlayer{
    @Override
    public void play(String fileName) {
        System.out.println("播放 mp3 文件: " + fileName);
    }
}

// 3. 适配器
class PlayerAdapter implements AudioPlayer {
    private Player player;
    public PlayerAdapter(String playerType) {
        if ("mp4".equalsIgnoreCase(playerType)) {
            player = new Mp4Player();
        }else if ("mp3".equalsIgnoreCase(playerType)) {
            player = new Mp3Player();
        }
    }
    @Override
    public void play(String audioType, String fileName) {
        player.play(fileName);
    }
}

// 4. 默认播放器支持 mp4,其他交给适配器
class DefaultAudioPlayer implements AudioPlayer {
    private PlayerAdapter playerAdapter;
    @Override
    public void play(String audioType, String fileName) {
        if ("mp4".equalsIgnoreCase(audioType)) {
            System.out.println("播放 mp4 文件: " + fileName);
        }else if ("mp4".equalsIgnoreCase(audioType) 
                || "mp3".equalsIgnoreCase(audioType)) {
            playerAdapter = new PlayerAdapter(audioType);
            playerAdapter.play(audioType, fileName);
        }else {
            System.out.println("不支持该格式: " + audioType);
        }
    }
}

// 5. 客户端调用
public static void main(String[] args) {
    AudioPlayer audioPlayer = new DefaultAudioPlayer();
    audioPlayer.play("mp4", "电影.mp4");
    audioPlayer.play("mp3", "音乐.mp3");
}