适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
优缺点
优点:
- 单一职责原则。你可以将接口或数据转换代码从程序主要业务逻辑中分离。
- 开闭原则。只要客户端代码通过客户端接口与适配器进行交互, 你就能在不修改现有客户端代码的情况下在程序中添加新类型的适配器。
缺点
- 代码整体复杂度增加, 因为你需要新增一系列接口和类。 有时直接更改服务类使其与其他代码兼容会更简单。
应用实例
普通音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。
代码实现
类适配器:基于继承方式
- 为普通音频播放器和更高级的音频播放器创建接口。
public interface MediaPlayer {
void play(String type, String name);
}
public interface AdvancedMediaPlayer {
void playMp4(String name);
void playVlc(String name);
}
- 创建 AdvancedMediaPlayer 接口的实现类。
public class AdvancedPlayer implements AdvancedMediaPlayer {
@Override
public void playMp4(String name) {
System.out.println("play mp4 " + name);
}
@Override
public void playVlc(String name) {
System.out.println("play vlc " + name);
}
}
- 创建 MediaPlayer 接口的适配器类。
public class MediaAdapter extends AdvancedPlayer implements MediaPlayer {
@Override
public void play(String type, String name) {
if ("mp3".equals(type)){
System.out.println("play mp3 " + name);
}else if ("mp4".equals(type)){
super.playMp4(name);
}else if ("vlc".equals(type)){
super.playVlc(name);
}else {
System.out.println("not supported");
}
}
}
- 使用 MediaAdapter 来播放不同类型的音频格式。
public class AdapterPatternDemo {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3", "beyond the horizon.mp3");
audioPlayer.play("mp4", "alone.mp4");
audioPlayer.play("vlc", "far far away.vlc");
audioPlayer.play("avi", "mind me.avi");
}
}
- 执行程序,输出结果
对象适配器:基于组合
- 为普通音频播放器和更高级的音频播放器创建接口。
public interface MediaPlayer {
void play(String type, String name);
}
public interface AdvancedMediaPlayer {
void playMp4(String name);
void playVlc(String name);
}
- 创建 AdvancedMediaPlayer 接口的实现类。
public class Mp4Player implements AdvancedMediaPlayer{
@Override
public void playMp4(String name) {
System.out.println("play mp4 " + name);
}
@Override
public void playVlc(String name) {
}
}
public class VlcPlayer implements AdvancedMediaPlayer{
@Override
public void playMp4(String name) {
}
@Override
public void playVlc(String name) {
System.out.println("play vlc " + name);
}
}
- 创建 MediaPlayer 接口的适配器类。
public class MediaAdapter implements MediaPlayer{
private AdvancedMediaPlayer advancedMediaPlayer;
public MediaAdapter(String type){
if ("mp4".equals(type)){
advancedMediaPlayer = new Mp4Player();
}else if ("vlc".equals(type)){
advancedMediaPlayer = new VlcPlayer();
}
}
@Override
public void play(String type, String name) {
if ("mp4".equals(type)){
advancedMediaPlayer.playMp4(name);
}else if ("vlc".equals(type)){
advancedMediaPlayer.playVlc(name);
}
}
}
- 创建 MediaPlayer 接口的实现类。
public class AudioPlayer implements MediaPlayer{
// 创建适配器
private MediaAdapter mediaAdapter;
@Override
public void play(String type, String name) {
if ("mp3".equals(type)){
System.out.println("play mp3 " + name);
}else if ("mp4".equals(type) || "vlc".equals(type)){
mediaAdapter = new MediaAdapter(type);
mediaAdapter.play(type,name);
}else {
System.out.println("not supported");
}
}
}
- 使用 AudioPlayer 来播放不同类型的音频格式。
public class AdapterPatternDemo {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3", "beyond the horizon.mp3");
audioPlayer.play("mp4", "alone.mp4");
audioPlayer.play("vlc", "far far away.vlc");
audioPlayer.play("avi", "mind me.avi");
}
}
- 执行程序,输出结果