适配器模式多用来拓展系统,是两个不兼容接口之间对接的桥梁,适配器结合了两个接口独立的功能。适配器模式不是用在系统设计阶段。
常见的适配器模式使用场景有如下这些:读卡器、笔记本充电器等。
示例如下:
项目最初设计了一个MediaPlayer接口,用来播放多媒体文件。
package AdapterPattern;
/**
* 播放器
*/
public interface MediaPlayer {
public void play();
}
最初只播放MP3格式的音频文件,于是又设计了一个MediaPlayer的实现类AudioPlayer用来播放MP3。
package AdapterPattern;
/**
* 系统原有播放器,只能播放MP3格式的文件
*/
public class AudioPlayer implements MediaPlayer{
@Override
public void play() {
System.out.println("播放MP3.");
}
}
此时来了一个新需求,要播放视频文件,格式也不止一种,有MP4的,也有VCR的。于是,设计一个新的高级播放器AdvancedMediaPlayer接口。
package AdapterPattern;
/**
* 高级播放器
*/
public interface AdvancedMediaPlayer {
public void playMP4();
public void playVCR();
}
定义播放MP4和VCR的播放器。
package AdapterPattern;
public class MP4Player implements AdvancedMediaPlayer{
@Override
public void playMP4() {
System.out.println("播放MP4.");
}
@Override
public void playVCR() {
//不予实现
}
}
package AdapterPattern;
public class VCRPlayer implements AdvancedMediaPlayer{
@Override
public void playMP4() {
//不予实现
}
@Override
public void playVCR() {
System.out.println("播放VCR.");
}
}
现在有一个新需求,想让一个多媒体播放器既能播放MP3文件,也能播放MP4、VCR之类的视频文件。当然,可以通过项目重构来实现。那么不项目重构怎么实现呢?此时就需要适配器模式了。
首先修改多媒体播放器接口MediaPlayer,为播放方法新增播放文件类型参数。
package AdapterPattern;
/**
* 播放器
*/
public interface MediaPlayer {
public void play(String fileType);
}
因为是要给MediaPlayer集成播放视频的功能,所以高级播放器接口AdvancedMediaPlayer和MP4Player和VCRPlayer这两个实现类都不必修改。
新增适配器:
package AdapterPattern;
/**
* 让MediaPlayer可以播放MP4和VCR
*/
public class MediaAdapter implements MediaPlayer{
AdvancedMediaPlayer player;
public MediaAdapter(String fileType) {
if(fileType.equals("MP4")){
player = new MP4Player();
}else if(fileType.equals("VCR")){
player = new VCRPlayer();
}
}
@Override
public void play(String fileType) {
if(fileType.equals("MP4")){
player.playMP4();
}else if(fileType.equals("VCR")){
player.playVCR();
}
}
}
因为要让MediaPlayer的实现类AudioPlayer播放视频,所以AudioPlayer也要做相应修改。
package AdapterPattern;
/**
* 系统原有播放器,只能播放MP3格式的文件
*/
public class AudioPlayer implements MediaPlayer{
MediaAdapter adapter;
@Override
public void play(String fileType) {
if(fileType.equals("MP3")){
System.out.println("播放MP3.");
}else if(fileType.equals("MP4") || fileType.equals("VCR")){
adapter = new MediaAdapter(fileType);
adapter.play(fileType);
}
}
}
运行测试类如下:
package AdapterPattern;
public class RunDemo {
public static void main(String[] args) {
MediaPlayer player = new AudioPlayer();
player.play("MP3");
player.play("MP4");
player.play("VCR");
}
}
运行结果图:
小结:适配器模式的核心在于,要给一个已有的接口集成新的功能,通过写适配器,继承或者实现原有的接口,重写原有接口的方法,增加新功能的实现。
适配器有很多种,对象适配器,类适配器,接口适配器。虽然名称不同,但是这三种适配器的不同之处只是在于实现的方式不一样,原理是一样的。
参考文档:设计模式|菜鸟教程,《设计模式之禅》
上一篇:设计模式(七)——原型模式