首页 > 技术文章 > 适配器模式

ningxinjie 2020-01-20 04:42 原文

首次接触适配器模式的就是操作数据库的  SqlDataAdapter 这就是典型适配器模式

 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

最简单的例子,我们电脑是3插头,但是墙上只有2插头,我们可以通过外插一个2转3的接头,让电脑的3插头插在这上面,这就是适配器的思想

例子使用菜鸟教程

默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件,我们希望它也可以播放mp4与vlc等其他文件,为了实现这个功能,我们需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。

  #region 接口
    interface MediaPlayer//调用者功能接口
    {
        void Play(string audioType,string fileName);
    }
    interface AdvancedMediaPlayer//具体功能接口
    {
         void playVlc(string fileName);
         void playMp4(string fileName);
    }
    #endregion
 #region 具体功能实现
    class VlcPlayer : AdvancedMediaPlayer
    {
        public void playMp4(string fileName)
        {
            //什么也不做
        }

        public void playVlc(string fileName)
        {
            Console.WriteLine("Playing vlc file. Name: " + fileName);
        }
    }
    class Mp4Player : AdvancedMediaPlayer
    {
        public void playMp4(string fileName)
        {
            Console.WriteLine("Playing mp4 file. Name: " + fileName);
        }

        public void playVlc(string fileName)
        {
            //什么也不做
        }
    }
    #endregion
 #region 创建实现了 MediaPlayer 接口的适配器类。
    class MediaAdapter : MediaPlayer
    {
        AdvancedMediaPlayer advancedmediaplayer;
        //private string _audioType;
        public MediaAdapter(string audioType)
        {
            //_audioType = audioType;
            if (audioType=="vlc")
            {
                advancedmediaplayer = new VlcPlayer();
            }
            else if (audioType=="mp4")
            {
                advancedmediaplayer = new Mp4Player();
            }
            else
            {
                advancedmediaplayer = null;
            }
        }
        public void Play(string audioType,string fileName)
        {
            if (audioType == "vlc")
            {
                advancedmediaplayer.playVlc(fileName);
            }
            else if (audioType == "mp4")
            {
                advancedmediaplayer.playMp4(fileName);
            }
            else if(audioType == "mp3")
            {
                Console.WriteLine("默认格式");
            }
            else
            {
                Console.WriteLine("暂不支持该格式");
            }
        }
    }
    #endregion
  #region 创建实现了 MediaPlayer 接口的实体类
    public class AudioPlayer : MediaPlayer
    {
        private MediaAdapter mediaadapter;

        public void Play(string audioType, string fileName)
        {
            mediaadapter = new MediaAdapter(audioType);
            mediaadapter.Play(audioType,fileName);
        }
    }
    #endregion

 

static void Main(string[] args)
        {
            //应用AudioPlayer调用适配器,完成适配
            AudioPlayer audioplayer = new AudioPlayer();
            audioplayer.Play("mp4","小酒窝mv*");
            audioplayer.Play("mp3", "小酒窝*");
            audioplayer.Play("vlc", "小酒窝vlc*");
            Console.ReadKey();
        }

 

 

适配器模式就是通过构造适配器,通过适配器可以完成现有的功能

上方的例子就是mp4与vlc格式不同,如果需要播放需要找不同对应的类,我们使用适配器去选择,再通过一个类,调用适配器,完成我们需要实现的功能

 

所谓适配器,就是可以找到最合适的那个调用者。

推荐阅读