適配器模式可以看作一種“補償模式”,用來補救設計上的缺陷。應用這種模式算是“無奈之舉”。如果在設計初期,我們就能協調規避接口不兼容的問題,那這種模式就沒有應用的機會了。
適配器模式(Adapter Pattern)是作為兩個不兼容的接口之間的橋梁。這種類型的設計模式屬于結構型模式,它結合了兩個獨立接口的功能。
Talk is cheap, show me the code。
假設原本系統中有一個音頻播放接口 IMP3Player 和它的實現類 MP3Player, 用來播放MP3格式的文件,如下:
interface IMP3Player {
func playMP3();
}
class MP3Player implements IMP3Player {
func playMP3() {
print "play mp3";
}
}
Mac電腦支持MP3播放:
interface IMacComputer {
func playMP3(player: IMP3Player);
}
class MacComputer implements IMacComputer {
func playMP3(player: IMP3Player) {
player.playMP3();
}
}
模擬Mac播放MP3功能:
class ComputerPlayAudioDemo {
func main() {
IMP3Player player = new MP3Player();
IMacComputer computer = new MacComputer();
computer.playMP3(player);
}
}
同時,ThinkPad支持播放VLC格式的音頻:
interface IVLCPlayer {
func playVLC();
}
class VLCPlayer implements IVLCPlayer {
func playVLC() {
print "play VLC";
}
}
interface IThinkPadComputer {
func playVLC(player: IVLCPlayer);
}
class ThinkPadComputer implements IThinkPadComputer {
func playAudio(player: IVLCPlayer) {
player.playVLC();
}
}
class ComputerPlayAudioDemo {
func main() {
IVLCPlayer player = new VLCPlayer();
IThinkPadComputer computer = new ThinkPadComputer();
computer.playVLC(player);
}
}
原本雙方相安無事,突然需求改動: 需要Mac支持VLC格式的文件。這時可能會在 Computer 中增加一個payer,就是這樣:
interface IMacComputer {
func playMP3(player: IMP3Player);
func playVLC(player: IVLCPlayer);
}
class MacComputer implements IMacComputer {
func playMP3(player: IMP3Player) {
player.playMP3();
}
func playVLC(player: IVLCPlayer) {
palyer.playVLC();
}
}
這樣確實可以解決問題,但是如果你只是播放器廠家呢?而且,給Mac增加一個VLC的播放器就要占用本就捉襟見肘的空間。
所以最優、最實惠的解決方案還是讓播放器適配VLC的功能,這也是適配器模式存在的意義——作為兩個不兼容的接口之間的橋梁,補救設計上的缺陷。
MP3播放器適配VLC:
class MP3PlayerAdapterVLC implements IMP3Player {
var vlcPlayer: IVLCPlayer;
func init(vlcPlayer: IVLCPlayer) {
self.vlcPlayer = vlcPlayer;
}
func playMP3() {
self.vlcPlayer.playVLC();
}
}
可以播放VLC的Mac Computer:
class ComputerPlayAudioDemo {
func main() {
IMP3Player player = new MP3Player();
IMacComputer computer = new MacComputer();
computer.playMP3(player);
IVLCPlayer vlcPlayer = new VLCPlayer();
MP3PlayerAdapterVLC adapter = new MP3PlayerAdapterVLC(vlcPlayer);
computer.playMP3(adapter);
}
}
本文到此結束,感謝閱讀。
歡迎關注微信公眾號查看更多高質量文章:愛編程的大頭