【Java设计模式】四、适配器模式

文章目录

1、适配器模式

  • 适配器模式Adapter Pattern,是做为两个不兼容的接口之间的桥梁
  • 目的是将一个类的接口转换成客户希望的另外一个接口
  • 适配器模式可以使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

最后,适配器是对已经开发完的系统的一种改造思路,新设计尽量一次设计好,或者时间充裕就重构。适配器太多会使得系统很乱,看着在调A接口,底下已被适配到了B接口。

2、举例

背景:有两个接口,分别为媒体播放器(播放音频)、高级媒体播放器(播放视频)。创建适配器,将二者的功能融合。两个接口:

java 复制代码
/**
 * 高级媒体播放器
 * 可播放视频
 */
public interface AdvanceMediaPlayer {

    public void playVlc(String fileName);

    public void playMp4(String fileName);
}
java 复制代码
/**
 * 媒体播放器接口
 * 可播放音频
 */
public interface MediaPlayer {

    public void play(String audioType, String fileName);
}

写高级媒体播放器的实现类:

java 复制代码
public class Mp4Player implements AdvanceMediaPlayer{

    @Override
    public void playVlc(String fileName) {
        当前格式为mp4格式,对vlc的播放不做具体实现
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("播放Mp4文件:" + fileName);
    }
}
java 复制代码
public class VlcPlayer implements AdvanceMediaPlayer{

    @Override
    public void playVlc(String fileName) {
        System.out.println("播放vlc文件:" + fileName);
    }

    @Override
    public void playMp4(String fileName) {
        //当前格式为vlc格式,对mp4的播放不做具体实现
    }
}

创建适配器,注入待合并的那个接口的对象。自定义有参构造方法,并对待合并接口对象完成初始化赋值:

java 复制代码
public class MediaPlayerAdapter implements MediaPlayer {

    private AdvanceMediaPlayer advanceMediaPlayer;

    /**
     * 定义个有参的构造方法,形参为自定义的String类型
     * @param audioType 媒体文件类型
     */
    public MediaPlayerAdapter(String audioType) {
        if ("vlc".equalsIgnoreCase(audioType)) {
            advanceMediaPlayer = new VlcPlayer();
        } else if ("mp4".equalsIgnoreCase(audioType)) {
            advanceMediaPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String audioType, String fileName) {
        //判断当前媒体的格式是mp4还是vlc
        if ("vlc".equalsIgnoreCase(audioType)) {
            //播放vlc文件
            advanceMediaPlayer.playVlc(fileName);
        } else if ("mp4".equalsIgnoreCase(audioType)) {
            //播放mp4文件
            advanceMediaPlayer.playMp4(fileName);
        }

    }
}

到此,适配器拥有了待合并接口所有实现类的功能。写另一个接口媒体播放器的实现类,里面注入适配器对象,如果是音频,则实现类正常完成,如果是视频,则通过适配器完成:

java 复制代码
public class AudioPlayer implements MediaPlayer {

    private MediaPlayerAdapter adapter;

    @Override
    public void play(String audioType, String fileName) {
        //音频文件,比如mp3
        if ("mp3".equalsIgnoreCase(audioType)) {
            System.out.println("播放mp3文件:" + fileName);
        } else if ("vlc".equalsIgnoreCase(audioType) || "mp4".equalsIgnoreCase(audioType)) {
            //视频文件(高级媒体文件)
            adapter = new MediaPlayerAdapter(audioType);
            adapter.play(audioType, fileName);     //到此,完成了两个接口的适配,不管是音频还是视频,我这儿都能播放
        }
    }
}

到此,完成合并,测试类:

java 复制代码
public class Test {

    public static void main(String[] args) {
        AudioPlayer audioPlayer = new AudioPlayer();
        audioPlayer.play("mp3", "啦啦啦.mp3");
        audioPlayer.play("vlc", "喜羊羊.vlc");
        audioPlayer.play("mp4", "视频.mp4");
    }
}
相关推荐
wrx繁星点点2 分钟前
事务的四大特性(ACID)
java·开发语言·数据库
IT学长编程9 分钟前
计算机毕业设计 Java酷听音乐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·音乐系统·计算机毕业设计选题
IT学长编程26 分钟前
计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·毕业论文·协同过滤算法·计算机毕业设计选题·个性化音乐推荐系统
小小娥子31 分钟前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存
几何心凉39 分钟前
已解决:org.springframework.web.HttpMediaTypeNotAcceptableException
java
华农第一蒟蒻41 分钟前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token
两点王爷43 分钟前
使用WebClient 快速发起请求(不使用WebClientUtils工具类)
java·网络
计算机学姐1 小时前
基于SpringBoot+Vue的高校运动会管理系统
java·vue.js·spring boot·后端·mysql·intellij-idea·mybatis
平凡的小码农1 小时前
JAVA实现大写金额转小写金额
java·开发语言
一直在进步的派大星1 小时前
Docker 从安装到实战
java·运维·docker·微服务·容器