面向對象編程思想-適配器模式
阿新 • • 發佈:2017-06-12
好的 優點 雷電 abstract 開閉 write 重新定義 style 部分
一、引言
富蘭克林揭秘了雷電的真實面目,那我們是否設想過將雷電儲存下來呢?生活中如果買了國外的電器(美國、日本)使用電壓為110V的,可國內通常電壓是220V的,國外電器使用電壓與國內電壓不符,那怎麽才能讓它適用國內這個環境而正常使用呢?我們知道這時候需要用到電源適配器220V-110V,電器才能正常使用。電源適配器實現能使用220V電壓方法,但實質調用的是使電器能使用110V電壓這一行為。類比在程序設計中,也存在這樣的思想,沒錯就是我們今天要學習的結構型設計模式之適配器模式
二、適配器模式
定義:將一個類的接口轉換成客戶希望的另外一個接口,使得原本由於接口不兼容而無法一起工作的類可以一起工作。
適配器模式有類適配器模式和對象適配器模式,下面是類的適配器模式代碼demo
//客戶所期待的接口,目標可以是具體或者抽象的類,也可以是接口(充當現有三孔插頭電器) public interface IThreeHole { void Request(); }
//兩口插頭 源角色- 需要適配的類(可以理解為現有一個兩孔插座) public abstract class TwoHole { public void SpecificRequest() { Console.WriteLine("我是兩孔插頭"); } }
//電源適配器 (類適配器) //適配器提供三孔插頭的行為 實質調用兩孔插頭的方法 public class PowerAdapter : TwoHole, IThreeHole { public void Request() { this.SpecificRequest(); } }
static void Main(string[] args) { //(類的適配器)通過電源適配器 使用兩孔插頭IThreeHole hole = new PowerAdapter(); hole.Request(); Console.Read(); }
下面是對象的適配器代碼demo
//三孔插頭 目標角色 public class ThreeHole { public virtual void Request() { } }
//兩孔插頭 源角色 public class TwoHole1 { public void SpecificRequest() { Console.WriteLine("我是兩孔插頭"); } }
//(對象的適配器類)適配器類 沒有繼承TwoHole1類 //通過在內部包裝一個Twohole1對象,使得源接口轉換成目標接口 public class PowerAdapter1 : IThreeHole { //引用兩孔插頭對象 使得客戶端可以通過適配器使用兩孔插頭的行為 private TwoHole1 hole = new TwoHole1(); public void Request() { hole.SpecificRequest(); } }
static void Main(string[] args) {//(對象的適配器) IThreeHole hole1 = new PowerAdapter1(); hole1.Request(); Console.Read(); }
類適配器優點:
1.在不修改原有代碼的基礎上復用現有類,很好的復合了“開閉原則”
2.可以重新定義被適配器類的部分行為,因為適配器類是被適配器類的子類
缺點:當適配器類匹配被適配器類及它的所有子類時,因為C#中類不能被多繼承,所以用類的適配器模式是實現不了的。兩個類耦合度較高。
對象適配器優點:
1.相比類適配器模式的優點,對象適配器采用“對象組合”的方式,更加的“松耦合”lll
缺點:重定義被適配器類的行為較困難,這時就需要生成被適配器的子類,並引入被適配器的子類而不是被適配器類
使用場景:復用一些現有的類,但是接口又與現有環境不一致的情況,如.NET類庫提供的適配器DataAdapter。
本文關於設計模式之適配器模式的學習就到這裏了,結構型設計模式更加關註類或者對象組合成的結構及依賴關系。
文中如有不足,歡迎斧正,感謝您的閱讀。
面向對象編程思想-適配器模式