一、什么是适配器模式
适配器模式,是两个不兼容接口之间的桥梁,他结合了两个独立接口的功能。
举个生活中例子:播放器有音频播放器和视频播放器,音频播放器只能播放音频,视频播放器只能播放视频,那怎么通过视频播放器去播放音频呢,可以通过适配器的方式实现。
二、如何实现适配器模式
以下通过代码实现上述例子的功能:
/*
音频播放器接口
*/
interface AudioPlayer {
void playMp3();
void PlayMp4();
}
/*
视频播放器接口
*/
interface VideoPlayer {
void playVideo();
}
/*
adapter接口
*/
interface MediaAdapter {
void playMedia(String mediaType);
}
/*
mp3播放器
*/
class Mp3Player implements AudioPlayer {
@Override
public void playMp3() {
System.out.println("Mp3播放器,可以播放Mp3音乐");
}
@Override
public void PlayMp4() {
// 不实现功能
}
}
/*
Mp4播放器
*/
class Mp4Player implements AudioPlayer {
@Override
public void playMp3() {
// 不实现功能
}
@Override
public void PlayMp4() {
System.out.println("MP4播放器,可以播放MP4文件");
}
}
/*
媒体适配器
*/
class MediaPlayer implements MediaAdapter {
AudioPlayer audioPlayer;
/**
* 根据传入的媒体判断是mp3还是MP4
* @param mediaType 媒体类型
*/
@Override
public void playMedia(String mediaType) {
if ("mp4".equalsIgnoreCase(mediaType)) {
audioPlayer = new Mp4Player();
audioPlayer.PlayMp4();
} else if ("mp3".equalsIgnoreCase(mediaType)) {
audioPlayer = new Mp3Player();
audioPlayer.playMp3();
}
}
}
/*
avi视频播放器,继承MediaAdapter类就可以实现播放Mp3和Mp4文件
*/
class AviPlayer extends MediaPlayer implements VideoPlayer {
@Override
public void playVideo() {
System.out.println("avi播放器,播放Avi文件");
}
}
/**
* 具体实现调用
*/
public class AdapterDemo {
public static void main(String[] args) {
AviPlayer aviPlayer = new AviPlayer();
// 播放avi文件
aviPlayer.playVideo();
// 播放mp4文件
aviPlayer.playMedia("mp4");
// 播放mp3文件
aviPlayer.playMedia("mp3");
}
}
输出结果如下
avi播放器,播放Avi文件
MP4播放器,可以播放MP4文件
Mp3播放器,可以播放Mp3音乐
三、适配器模式的优缺点
适配器模式具有以下优点:
1、可以将两个没有任何关联的类一起运行。
2、提高了类的复用
3、增加了类的透明度
4、灵活性好
但也有缺点:
1、过多使用适配器会导致系统凌乱,不易于整体进行把握。
2、java只允许继承一个类,因此至多继承一个适配器类。
使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。