1.適配器模式介紹
適配器模式是一種結構型設計模式,它允許不兼容的接口協同工作。適配器模式的核心思想是將一個類的接口轉換成客戶期望的另一個接口,使得原本由于接口不兼容而不能一起工作的類可以一起工作。
你可以將其想象成一個“轉換插頭”——假設你有一個中國的電器插頭,但你在歐洲旅行,需要將它插入歐洲的插座。適配器就是那個可以讓中國插頭插入歐洲插座的轉換器。
在軟件開發中,適配器模式通常用于整合一些舊的代碼或第三方庫,使它們能夠與新的系統一起工作,而不需要修改它們的內部實現。適配器模式通過創建一個“適配器類”,這個類在內部轉換接口,使得不兼容的接口可以順利地互操作。
適配器模式通常包含以下幾個角色:
- 目標接口(Target):這是客戶期望的接口,目標可以是具體的或抽象的類。
- 適配者(Adaptee):這是需要適配的類,擁有客戶希望使用的功能,但接口不兼容。
- 適配器(Adapter):通過在內部包裝一個適配者對象,把適配者的接口轉換為目標接口。
2. 代碼演示
場景說明:我們創建一個媒體播放器MediaPlayer作為目標接口,一個老的媒體播放器OldMediaPlayer(接口及其實現)作為適配者,并且通過MediaAdapter
?類實現了適配器,最終實現復用老媒體播放器功能。
目標接口:
public interface MediaPlayer {void play(String audioType, String fileName);
}
適配者:OldMediaPlayer及其實現類
//老媒體播放器,里面有希望使用的功能
public interface OldMediaPlayer {void playVlc(String fileName);void playMp4(String fileName);
}//map4播放器
public class Mp4Player implements OldMediaPlayer {@Overridepublic void playVlc(String fileName) {// Do nothing}@Overridepublic void playMp4(String fileName) {System.out.println("Playing mp4 file. Name: " + fileName);}
}//vlc播放器
public class VlcPlayer implements OldMediaPlayer {@Overridepublic void playVlc(String fileName) {System.out.println("Playing vlc file. Name: " + fileName);}@Overridepublic void playMp4(String fileName) {// Do nothing}
}
適配器:
//適配器:通過在內部包裝一個適配者對象,把適配者的接口轉換為目標接口
public class MediaAdapter implements MediaPlayer {//實現了 MediaPlayer 接口并使用 OldMediaPlayer 的實例OldMediaPlayer oldMediaPlayer;public MediaAdapter(String audioType){if(audioType.equalsIgnoreCase("vlc") ){oldMediaPlayer = new VlcPlayer();} else if (audioType.equalsIgnoreCase("mp4")){oldMediaPlayer = new Mp4Player();}}@Overridepublic void play(String audioType, String fileName) {if(audioType.equalsIgnoreCase("vlc")){oldMediaPlayer.playVlc(fileName);}else if(audioType.equalsIgnoreCase("mp4")){oldMediaPlayer.playMp4(fileName);}}
}
使用適配器:
//使用適配器來播放不同格式的音頻文件
public class AudioPlayer implements MediaPlayer {MediaAdapter mediaAdapter;@Overridepublic void play(String audioType, String fileName) {// Inbuilt support for mp3 music filesif(audioType.equalsIgnoreCase("mp3")){System.out.println("Playing mp3 file. Name: "+ fileName);}// MediaAdapter is providing support to play other file formatselse 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 Demo {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");}
}
上述例子中,MediaAdapter類充當了適配器的角色,通過實現?MediaPlayer
?接口,并在內部調用?OldMediaPlayer
?的?playXXX()
?方法,實現了接口的兼容。這樣,新的音頻系統就可以使用舊的播放器來播放音樂,而不需要對舊的播放器進行任何修改。