一、适配器模式的概述
适配器模式是一种将一个类的接口转换成客户期望的另一个接口的设计模式,旨在解决原接口与目标接口之间不兼容的问题。
适配器模式分为类适配器模式和对象适配器模式,类适配器模式使用继承关系来实现,而对象适配器模式使用组合关系来实现。
二、适配器模式的应用实例类图
下面是适配器模式的应用实例的类图:
┌──────────┐ ┌───────────────┐ │ Target │◄─────────────── │ Adapter │ └──────────┘ ├─ adaptee │ ├─ request() │ └───────────────┘ ┌───────────────┐ │ Adaptee │ └───────────────┘
三、适配器模式的应用实例有哪些
适配器模式在实际项目中有很多应用,以下是几个常见的应用实例:
四、适配器模式的例子
以美国插头和中国插座为例,插头不兼容是一个典型的适配器模式应用实例。美国的插头是二平行插脚的,而中国的插座是二楔形插孔的,它们不兼容。所以需要一个适配器来做桥梁,将美国插头转换为中国插座可以接收的形式。
下面是适配器模式的应用实例的代码:
// 客户端代码 public class Client { public static void main(String[] args) { Target target = new Adapter(); target.request(); } } // 目标接口 public interface Target { void request(); } // 适配器 public class Adapter implements Target { private Adaptee adaptee = new Adaptee(); @Override public void request() { adaptee.specificRequest(); } } // 源类 public class Adaptee { public void specificRequest() { System.out.println("美国插头"); } }
五、工厂方法模式的应用实例
一个系统中可能存在多个播放器,每个播放器支持播放不同的音频格式,为了满足客户端需要,需要把所有的播放器统一到一个接口中去。这时可以采用适配器模式来解决问题。
下面是适配器模式的应用实例的代码:
// 客户端代码 public class Client { public static void main(String[] args) { MediaPlayer player; player = new AudioPlayer(); player.play("mp3", "Beyond the horizon.mp3"); player = new MediaAdapter("mp4"); player.play("mp4", "alone.mp4"); player = new MediaAdapter("vlc"); player.play("vlc", "far far away.vlc"); } } // 目标接口 public interface MediaPlayer { public void play(String audioType, String fileName); } // 源类 public interface AdvancedMediaPlayer { public void playVlc(String fileName); public void playMp4(String fileName); } // 播放器类 public class AudioPlayer implements MediaPlayer { MediaAdapter mediaAdapter; @Override 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("vlc") || audioType.equalsIgnoreCase("mp4")) { mediaAdapter = new MediaAdapter(audioType); mediaAdapter.play(audioType, fileName); } else { System.out.println("Invalid media. " + audioType + " format not supported"); } } } // 适配器类 public class MediaAdapter implements MediaPlayer { AdvancedMediaPlayer advancedMusicPlayer; public MediaAdapter(String audioType) { if (audioType.equalsIgnoreCase("vlc")) { advancedMusicPlayer = new VlcPlayer(); } else if (audioType.equalsIgnoreCase("mp4")) { advancedMusicPlayer = new Mp4Player(); } } @Override public void play(String audioType, String fileName) { if (audioType.equalsIgnoreCase("vlc")) { advancedMusicPlayer.playVlc(fileName); } else if (audioType.equalsIgnoreCase("mp4")) { advancedMusicPlayer.playMp4(fileName); } } } // 源类 public class Mp4Player implements AdvancedMediaPlayer { @Override public void playVlc(String fileName) {} @Override public void playMp4(String fileName) { System.out.println("Playing mp4 file. Name: " + fileName); } } // 源类 public class VlcPlayer implements AdvancedMediaPlayer { @Override public void playVlc(String fileName) { System.out.println("Playing vlc file. Name: " + fileName); } @Override public void playMp4(String fileName) {} }
六、适配器模式应用场景
适配器模式可以用在以下场景中:
- 系统需要使用一些现有的类,而这些类的接口不符合系统的需求。
- 想要创建一个可以重用的类,他的接口与其它不相关或不可预见的类的接口协作。
- 需要将一些类的接口转换为客户端期望的接口。
七、对象适配器模式的典型应用
使用对象适配器模式将一个类的接口转换成客户希望的另一个接口,这种情况下我们可以使用对象适配器模式。
下面是对象适配器模式的应用实例的代码:
// 目标接口 public interface Target { void request(); } // 源类 public class Adaptee { public void specificRequest() { System.out.println("美国插头"); } } // 适配器 public class ObjectAdapter implements Target { private Adaptee adaptee; public ObjectAdapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void request() { adaptee.specificRequest(); } } // 客户端代码 public class Client { public static void main(String[] args) { Target target = new ObjectAdapter(new Adaptee()); target.request(); } }
八、适配器模式经典例子
适配器模式的经典例子是JAVA集合框架中的 Enumeration接口,该接口提供了一种读取一组数据的方式,但是它的方法与 Iterator的方法不同,由于 Iterator更加灵活和易用,于是可以使用适配器模式来将 Enumeration适配成 Iterator接口。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/296022.html