深入理解设计模式之适配器模式

深入理解设计模式之适配器模式

1. 适配器模式概述

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换为客户端所期望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类能够协同工作,扮演了"转换器"的角色。

2. 适配器模式的核心组成

  • 目标接口(Target): 客户端所期望的接口
  • 适配者(Adaptee): 需要被适配的类或接口
  • 适配器(Adapter): 将适配者接口转换为目标接口的类

3. 适配器模式的类型

3.1 对象适配器

通过组合方式实现,适配器持有适配者的实例。

3.2 类适配器

通过继承方式实现,适配器同时继承适配者和实现目标接口。

4. 适配器模式实现

4.1 对象适配器实现

// 目标接口
interface MediaPlayer {
   
   
    void play(String audioType, String fileName);
}

// 适配者接口
interface AdvancedMediaPlayer {
   
   
    void playVlc(String fileName);
    void playMp4(String fileName);
}

// 具体适配者实现
class VlcPlayer implements AdvancedMediaPlayer {
   
   
    @Override
    public void playVlc(String fileName) {
   
   
        System.out.println("Playing vlc file: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {
   
   
        // 不做任何事
    }
}

class Mp4Player implements AdvancedMediaPlayer {
   
   
    @Override
    public void playVlc(String fileName) {
   
   
        // 不做任何事
    }

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

// 适配器
class MediaAdapter implements MediaPlayer {
   
   
    private 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);
        }
    }
}

// 客户端
class AudioPlayer implements MediaPlayer {
   
   
    private MediaAdapter mediaAdapter;

    @Override
    public void play(String audioType, String fileName) {
   
   
        // 播放mp3格式音频文件的内置支持
        if (audioType.equalsIgnoreCase("mp3")) {
   
   
            System.out.println("Playing mp3 file: " + fileName);
        }
        // 通过适配器播放其他格式
        else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
   
   
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        } else 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值