文章出處

返回目錄

之前和大家一起談了工廠模式單例模式,今天來看一下另一種非常常用的模式,它就是適配器模式,第一次看到這個模式是通過“張逸”老師的“設計之道”這篇文章,在這里表adapter講的很透徹,今天把張老師的文章拿過來,分享給大家!

何時能用到它?

對于一個軟件生產商A來說,在過去的20年里,它們主要生產收音機,包括最早的老式半導體和現代的數字收音機,總之,是收音機。但不知道從什么時候開始,MP4媒體播放器出現了,這使得A生產商不得不去招新人,去生產適合大家的mp4播放器,這東西很好,能聽音樂,看電影,比20年前的收音機好多了!

正在A生產商洋洋得意時,突然有個客戶投訴他們,說你們的東西為何沒有收音機的功能,我想叫廣播!這下可讓A生產商發愁了,它馬上找到了公司的技術總監,CTO是個很厲害的崗位,它們無所不能,只要你有需求,我們就可以給你實現!CTO是如何讓mp4播放器具體收音機功能的呢?大家繼續看

適配器模式的結構圖

適配器模式實現說明

媒體播放接口IMedia

視頻實現抽象類VideoMedia

音頻實現抽象類AudioMedia

mp4播放器實現類:mp4Media和mp3Media,可能還有FlvMedia等

收音機接口IRadio

收音機抽象類Radio

收音機FM調頻實現類FmRadio

收音機FM調頻與媒體播放器的適配器FmAdapter

適配器模式的C#實現

#region adapter[播放器適配器]
    #region 媒體播放器
    interface IMedia
    {
        void Play();
        void Stop();
        void Next();
        void Prev();
        void Pause();
        void OpenFile();
        void CloseFile();
    }
    abstract class AudioMedia : IMedia
    {
        public virtual void Play()
        {
            throw new NotImplementedException();
        }

        public void Stop()
        {
            throw new NotImplementedException();
        }

        public void Next()
        {
            throw new NotImplementedException();
        }

        public void Prev()
        {
            throw new NotImplementedException();
        }

        public void Pause()
        {
            throw new NotImplementedException();
        }

        public void OpenFile()
        {
            throw new NotImplementedException();
        }

        public void CloseFile()
        {
            throw new NotImplementedException();
        }
    }
    abstract class VideoMedia : IMedia
    {
        public virtual void Play()
        {
            throw new NotImplementedException();
        }

        public void Stop()
        {
            throw new NotImplementedException();
        }

        public void Next()
        {
            throw new NotImplementedException();
        }

        public void Prev()
        {
            throw new NotImplementedException();
        }

        public void Pause()
        {
            throw new NotImplementedException();
        }

        public void OpenFile()
        {
            throw new NotImplementedException();
        }

        public void CloseFile()
        {
            throw new NotImplementedException();
        }
    }
    class Mp3Media : AudioMedia
    {
        public override void Play()
        {
            base.Play();
            Console.WriteLine("播放mp3");
        }
    }
    class Mp4Media : VideoMedia
    {
        public override void Play()
        {
            base.Play();
            Console.WriteLine("播放mp4");
        }
    }
    #endregion
    #region 收音機
    interface IRadio
    {
        void Receive();
        void Stop();
        void TurnOn();
        void TurnOff();
        void Change(bool direction);
    }
    abstract class Radio : IRadio
    {
        public virtual void Receive()
        {
            throw new NotImplementedException();
        }

        public void Stop()
        {
            throw new NotImplementedException();
        }

        public void TurnOn()
        {
            throw new NotImplementedException();
        }

        public void TurnOff()
        {
            throw new NotImplementedException();
        }

        public virtual void Change(bool direction)
        {
            throw new NotImplementedException();
        }
    }
    class FmRadio : Radio
    {
        public override void Receive()
        {
            base.Receive();
            Console.WriteLine("接口FM頻段");
        }
        public override void Change(bool direction)
        {
            base.Change(direction);
            Console.WriteLine("改變FM頻段");
        }
    }
    #endregion
    #region 收音機到媒體播放器的適配器
    class FMAdapter : Radio, IMedia
    {
        //! 適配器通過Radio去實現了IMedia接口

        public void Play()
        {
            base.TurnOn();
            base.Receive();
        }

        public void Stop()
        {
            base.TurnOff();
        }

        public void Next()
        {
            base.Change(true);

        }

        public void Prev()
        {
            base.Change(false);
        }

        public void Pause()
        {
            throw new NotImplementedException();
        }

        public void OpenFile()
        {
            throw new NotImplementedException();
        }

        public void CloseFile()
        {
            throw new NotImplementedException();
        }
    }
    #endregion
    #endregion

這樣我們就實現了Radio與Media兩大對象的聯系,而這種聯系是在不破壞對象本身的基礎上實現的,這種實現的過程就是適配器模式實現的過程!

感謝GOF,感謝張逸老師!

 

 返回目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()