本文共 3516 字,大约阅读时间需要 11 分钟。
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。 缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
/** * 1. 为媒体播放器创建接口。 * @author mazaiting */public interface MediaPlayer { /** * 播放视频 * @param audioType 类型 * @param fileName 文件名 */ void play(String audioType, String fileName);}/** * 1. 为更高级的媒体播放器创建接口。 * @author mazaiting */public interface AdvancedMediaPlayer { /** * 播放Vlc视屏格式 */ void playVlc(String fileName); /** * 播放Mp4视屏格式 */ void playMp4(String fileName);}
/** * 2. 创建实现了 AdvancedMediaPlayer 接口的实体类。 * @author mazaiting */public class VlcPlayer implements AdvancedMediaPlayer{ public void playVlc(String fileName) { System.out.println("Playing vlc file. Name: " + fileName); } public void playMp4(String fileName) {}}/** * 2. 创建实现了 AdvancedMediaPlayer 接口的实体类。 * @author mazaiting */public class Mp4Player implements AdvancedMediaPlayer{ public void playVlc(String fileName) {} public void playMp4(String fileName) { System.out.println("Playing mp4 file. Name: " + fileName); }}
/** * 3. 创建实现了 MediaPlayer 接口的适配器类。 * @author mazaiting */public class MediaAdapter implements MediaPlayer{ /**vlc格式*/ public static final String VLC = "vlc"; /**mp4格式*/ public static final String MP4 = "mp4"; AdvancedMediaPlayer advancedMediaPlayer; public MediaAdapter(String audioType){ if (audioType.equalsIgnoreCase(VLC)){ advancedMediaPlayer = new VlcPlayer(); } else if (audioType.equalsIgnoreCase(MP4)){ advancedMediaPlayer = new Mp4Player(); } } public void play(String audioType, String fileName) { if (audioType.equalsIgnoreCase(VLC)){ advancedMediaPlayer.playVlc(fileName); } else if (audioType.equalsIgnoreCase(MP4)) { advancedMediaPlayer.playMp4(fileName); } }}
/** * 4. 创建实现了 MediaPlayer 接口的实体类。 * @author mazaiting */public class AudioPlayer implements MediaPlayer{ /**mp3格式*/ public static final String MP3 = "mp3"; MediaAdapter mediaAdapter; public void play(String audioType, String fileName) { // 播放 MP3 音乐文件的内置支持 if (audioType.equalsIgnoreCase("mp3")) { System.out.println("Playing mp3 file. Name: " + fileName); } // mediaAdapter 提供了其他文件格式的支持 else if (audioType.equalsIgnoreCase(MediaAdapter.VLC) || audioType.equalsIgnoreCase(MediaAdapter.MP4)) { mediaAdapter = new MediaAdapter(audioType); mediaAdapter.play(audioType, fileName); }else { System.out.println("Invalid media. "+ audioType + " format not supported"); } }}
public class Client { 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"); }}
Playing mp3 file. Name: beyond the horizon.mp3Playing mp4 file. Name: alone.mp4Playing vlc file. Name: far far away.vlcInvalid media. avi format not supported
转载地址:http://fzwno.baihongyu.com/