适配器模式(Adapter Pattern)

适配器模式是作为两个不同接口的一种聚合,把比如说SD卡适配器,无论使用TF或SD卡或者其它卡,对外输出都是USB接口。

适配器模式的实例

首先我们有两个设备一个是Vlc播放器,一个是Mp4播放器,一个需要使用playVlc按钮来播放,一个要使用playMp4来播放。

  1. class VlcPlayer {
  2. playVlc(fileName) {
  3. console.log("Playing vlc file. Name: "+ fileName);
  4. }
  5. }
  6. class Mp4Player {
  7. playMp4(fileName) {
  8. console.log("Playing mp4 file. Name: "+ fileName);
  9. }
  10. }

但是我就想通过一个播放按钮来播放,我不管他是什么播放设备,这个时候,我们就需要一个适配器来做这个事情。

  1. class MediaAdapter {
  2. constructor(audioType){
  3. switch(audioType) {
  4. case 'vlc':
  5. MediaAdapter.advancedMusicPlayer = new VlcPlayer();
  6. break;
  7. case 'mp4':
  8. MediaAdapter.advancedMusicPlayer = new Mp4Player();
  9. break;
  10. }
  11. }
  12. play(audioType, fileName) {
  13. switch(audioType) {
  14. case 'vlc':
  15. MediaAdapter.advancedMusicPlayer.playVlc(fileName);
  16. break;
  17. case 'mp4':
  18. MediaAdapter.advancedMusicPlayer.playMp4(fileName);
  19. break;
  20. }
  21. }
  22. }

通过适配器我们可以把各种设备桥接到一个音频设备上。

  1. class AudioPlayer{
  2. play(audioType, fileName) {
  3. switch(audioType) {
  4. case 'mp3':
  5. console.log("Playing mp3 file. Name: "+ fileName);
  6. break;
  7. case 'vlc':
  8. case 'mp4':
  9. AudioPlayer.mediaAdapter = new MediaAdapter(audioType);
  10. AudioPlayer.mediaAdapter.play(audioType, fileName);
  11. break;
  12. default:
  13. console.log("Invalid media. "+
  14. audioType + " format not supported");
  15. break;
  16. }
  17. }
  18. }

那么这个时候我们就可以直接通过这个音频设备来播放我们想要播放的音频了

  1. const audioPlayer = new AudioPlayer();
  2. audioPlayer.play("mp3", "beyond the horizon.mp3");
  3. audioPlayer.play("mp4", "alone.mp4");
  4. audioPlayer.play("vlc", "far far away.vlc");
  5. audioPlayer.play("avi", "mind me.avi");
  6. /**
  7. * output:
  8. * Playing mp3 file. Name: beyond the horizon.mp3
  9. * Playing mp4 file. Name: alone.mp4
  10. * Playing vlc file. Name: far far away.vlc
  11. * Invalid media. avi format not supported
  12. */

适配器模式的优势

可以让两个不同接口作为一个适配的接口使用,这样对下层的关心可以减少.

上一页(原型模式)

下一页(桥接模式)