一、適配器模式的概述
適配器模式是一種將一個類的接口轉換成客戶期望的另一個接口的設計模式,旨在解決原接口與目標接口之間不兼容的問題。
適配器模式分為類適配器模式和對象適配器模式,類適配器模式使用繼承關係來實現,而對象適配器模式使用組合關係來實現。
二、適配器模式的應用實例類圖
下面是適配器模式的應用實例的類圖:
┌──────────┐ ┌───────────────┐ │ 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/zh-hk/n/296022.html