适配器模式

描述

适配器的理解很简单,举个例子:我们都见过存储卡,一般手机都可以装上存储卡,手机可以对存储卡直接读写,但是如果想用电脑读写存储卡呢?那就需要一个媒介---卡托,把存储卡插在卡托上,卡托上有个USB的数据口,而所有电脑都支持USB口,这样就可以用电脑读写存储卡内容了。卡托这个神器就是一种适配器。适配器是两个不兼容实体之间的转换器。适配器模式是一种结构模式。

适配器模式比较官方的概念是:是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

例子

假设有两个播放器AudioPlayer和VideoPlayer,其中AudioPlayer能够播放所有音频文件(如.mp3),VideoPlayer能播放所有视频文件(如.mp4)。但是如果在AudioPlayer中输入一个.mp4的文件,它是不能识别不能播放的,同理,在VideoPlayer中放入.mp3文件也是不可以识别的。

现在我们通过适配器模式,实现一个基于AudioPlayer和VideoPlayer适配器,我们把一个文件放入适配器中,不论是音频还是视频,都可以正常播放。

interface Player {
   public void play(String type, String fileName);
}
interface AudioPlayer {  
   public void playAudio(String fileName);
}
interface VideoPlayer {  
   public void playVideo(String fileName);
}
class MyAudioPlayer implements AudioPlayer {
   @Override
   public void playAudio(String fileName) {
      System.out.println("Playing. Name: "+ fileName);    
   }
}
class MyVideoPlayer implements VideoPlayer {
   @Override
   public void playVideo(String fileName) {
      System.out.println("Playing. Name: "+ fileName);    
   }
}

class MyPlayer implements Player {

   AudioPlayer audioPlayer = new MyAudioPlayer();
   VideoPlayer videoPlayer = new MyVideoPlayer();
   
   public MyPlayer(){      
   }
   @Override
   public void play(String audioType, String fileName) {
      if(audioType.equalsIgnoreCase("avi")){
         videoPlayer.playVideo(fileName);
      }else if(audioType.equalsIgnoreCase("mp3")){
         audioPlayer.playAudio(fileName);
      }
   }
}
public class Main{
   public static void main(String[] args) {
      MyPlayer myPlayer = new MyPlayer();

      myPlayer.play("mp3", "h.mp3");
      myPlayer.play("avi", "me.avi");
   }
}

输出结果:

Playing. Name: h.mp3

Playing. Name: me.avi

posted @ 2017-11-22 17:09  K_artorias  阅读(238)  评论(0编辑  收藏  举报