文章出處
文章列表
之前和大家一起談了工廠模式和單例模式,今天來看一下另一種非常常用的模式,它就是適配器模式,第一次看到這個模式是通過“張逸”老師的“設計之道”這篇文章,在這里表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,感謝張逸老師!
文章列表
全站熱搜