设计模式七-适配器模式

适配器模式是将一个接口转换成客户端期望的接口,用于系统集成或不兼容系统间的集成。文章提供了一个Java实例,展示如何通过适配器让旧的MP3播放器与支持MP4和AVI的新播放列表类协同工作。适配器模式增加了系统的复用性和扩展性,但也可能增加复杂度。
摘要由CSDN通过智能技术生成

适配器模式是一种结构型设计模式,它能够将一个接口转换成另一个客户端所期望的接口。适配器模式通常用于现有的系统与新系统的集成,或者两个不兼容的系统之间的集成。

下面是一个适配器模式的Java实例:

假设我们有一个旧的音乐播放器,它能够播放MP3格式的音乐。我们需要将这个播放器与新的播放列表类集成起来,新的播放列表类可以播放不同的音乐格式,包括MP3、MP4和AVI等。

首先,我们定义一个音乐播放器接口 MediaPlayer,其中包含了播放MP3格式音乐的方法:

public interface MediaPlayer {
    public void play(String audioType, String fileName);
}

然后,我们创建一个实现了这个接口的具体类 AudioPlayer

public class AudioPlayer implements MediaPlayer {
    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp3")) {
            System.out.println("Playing mp3 file. Name: " + fileName);
        }
    }
}

现在,我们需要将这个播放器适配到新的播放列表中,所以我们创建了一个新的接口 AdvancedMediaPlayer,其中包含了播放MP4和AVI格式音乐的方法:

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

然后,我们创建两个实现了这个接口的具体类 Mp4PlayerAviPlayer

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

    @Override
    public void playAvi(String fileName) {
        // do nothing
    }
}

public class AviPlayer implements AdvancedMediaPlayer {
    @Override
    public void playMp4(String fileName) {
        // do nothing
    }

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

最后,我们创建一个适配器 MediaAdapter,该适配器实现了 MediaPlayer 接口,并将其适配到 AdvancedMediaPlayer 接口中:

public class MediaAdapter implements MediaPlayer {
    AdvancedMediaPlayer advancedMediaPlayer;

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

    @Override
    public void play(String audioType, String fileName) {
        if

现在,我们可以将这个适配器用于新的播放列表类中:

public class Playlist {
    List<MediaPlayer> mediaPlayers = new ArrayList<>();

    public void addMedia(MediaPlayer mediaPlayer) {
        mediaPlayers.add(mediaPlayer);
    }

    public void play(String audioType, String fileName) {
        for (MediaPlayer mediaPlayer : mediaPlayers) {
            mediaPlayer.play(audioType, fileName);
        }
    }
}

现在我们可以使用这个新的播放列表类,播放各种音乐格式的音乐,包括MP3、MP4和AVI等:

public static void main(String[] args) {
    AudioPlayer audioPlayer = new AudioPlayer();
    MediaAdapter mp4Adapter = new MediaAdapter("mp4");
    MediaAdapter aviAdapter = new MediaAdapter("avi");

    Playlist playlist = new Playlist();
    playlist.addMedia(audioPlayer);
    playlist.addMedia(mp4Adapter);
    playlist.addMedia(aviAdapter);

    playlist.play("mp3", "Beyond the horizon.mp3");
    playlist.play("mp4", "Alone.mp4");
    playlist.play("avi", "Mind me.avi");
}

适配器模式的应用场景包括:

  1. 系统需要使用现有的类,而这些类的接口不符合系统的需求。
  2. 我们需要在一个类中使用多个类的功能,但这些类的接口不一致,需要适配它们的接口。
  3. 在不修改原有代码的基础上,对现有代码进行扩展,以适应新的需求。

适配器模式的优点包括:

  1. 可以让两个不兼容的接口协同工作。
  2. 可以重用现有的类。
  3. 可以在不修改原有代码的基础上,对现有代码进行扩展,以适应新的需求。

但是,适配器模式也有一些缺点,包括:

  1. 增加了系统的复杂度。
  2. 可能会降低系统的性能。
  3. 适配器模式不适用于经常发生变化的系统,因为它可能需要频繁地进行修改。

总之,适配器模式是一种非常有用的设计模式,可以帮助我们解决接口不兼容的问题,提高代码的复用性和扩展性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值