適配器模式(Adapter Pattern) :將一個接口轉換成客戶但願的另外一個接口,適配器模式使接口不兼容的那些類能夠一塊兒工做,其別名爲包裝器(Wrapper)。適配器模式既能夠做爲類結構型模式,也能夠做爲對象結構型模式。git
Target類:github
namespace AdapterPattern.BasicStructure.ClassAdapter { /// <summary> /// 接口 /// </summary> interface ITarget { void Request(); } }
Adapter類:編程
namespace AdapterPattern.BasicStructure.ClassAdapter { class Adapter : Adaptee, ITarget { public void Request() { this.SpecificRequest(); } } }
Adaptee類:app
namespace AdapterPattern.BasicStructure.ClassAdapter { /// <summary> /// 須要要適配的類 /// </summary> class Adaptee { /// <summary> /// 特殊的請求 /// </summary> public void SpecificRequest() { Console.WriteLine("特殊請求!"); } } }
客戶端調用代碼:編程語言
static void Main(string[] args) { try { {//BasicStructure-ClassAdapter BasicStructure.ClassAdapter.ITarget target = new BasicStructure.ClassAdapter.Adapter(); //表面看像是調用了Request()方法,但實際是調用了SpecificRequest()方法 target.Request(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
結果以下:this
Target類;spa
namespace AdapterPattern.BasicStructure.ObjectAdapter { /// <summary> /// 接口 /// </summary> interface ITarget { void Request(); } }
Adapter類:code
namespace AdapterPattern.BasicStructure.ObjectAdapter { class Adapter : ITarget { private Adaptee _adaptee = new Adaptee(); public void Request() { _adaptee.SpecificRequest(); } } }
Adaptee類:orm
namespace AdapterPattern.BasicStructure.ObjectAdapter { /// <summary> /// 須要要適配的類 /// </summary> class Adaptee { /// <summary> /// 特殊的請求 /// </summary> public void SpecificRequest() { Console.WriteLine("特殊請求!"); } } }
客戶端調用代碼:對象
static void Main(string[] args) { try { {//BasicStructure-ObjectAdapter BasicStructure.ObjectAdapter.ITarget target = new BasicStructure.ObjectAdapter.Adapter(); target.Request(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
結果以下:
場景模擬:以筆記本電腦要用220V的電壓爲例
Computer(電腦)類——Target類
namespace AdapterPattern.SituationSimulation.ClassAdapter { /// <summary> /// 接口 /// </summary> interface IComputer { void GetVoltage(); } }
Transformer(變壓器)類——Adapter類
namespace AdapterPattern.SituationSimulation.ClassAdapter { /// <summary> /// 變壓器 /// </summary> class Transformer : NoteBook, IComputer { public void GetVoltage() { this.Get220Voltage(); } } }
NoteBook(筆記本)類——Adaptee類
namespace AdapterPattern.SituationSimulation.ClassAdapter { /// <summary> /// 筆記本電腦類 /// </summary> class NoteBook { /// <summary> /// 獲取220V 電壓 /// 系統中已經存在的類,與ITarget接口不兼容,又很差修改這個類 /// </summary> public void Get220Voltage() { Console.WriteLine("我要使用220V 電壓才能正常工做!"); } } }
客戶端調用代碼:
static void Main(string[] args) { try { {//SituationSimulation-ClassAdapter SituationSimulation.ClassAdapter.IComputer target = new SituationSimulation.ClassAdapter.Transformer(); target.GetVoltage(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
結果以下:
Computer(電腦)類——Target類
namespace AdapterPattern.SituationSimulation.ObjectAdapter { /// <summary> /// 接口 /// </summary> interface IComputer { void GetVoltage(); } }
Transformer(變壓器)類——Adapter類
namespace AdapterPattern.SituationSimulation.ObjectAdapter { /// <summary> /// 變壓器 /// </summary> class Transformer : IComputer { private NoteBook _noteBook = new NoteBook(); public void GetVoltage() { _noteBook.Get220Voltage(); } } }
NoteBook(筆記本)類——Adaptee類
namespace AdapterPattern.SituationSimulation.ObjectAdapter { /// <summary> /// 筆記本電腦類 /// </summary> class NoteBook { /// <summary> /// 獲取220V 電壓 /// 系統中已經存在的類,與ITarget接口不兼容,又很差修改這個類 /// </summary> public void Get220Voltage() { Console.WriteLine("我要使用220V 電壓才能正常工做!"); } } }
客戶端調用代碼:
static void Main(string[] args) { try { {//SituationSimulation-ObjectAdapter SituationSimulation.ObjectAdapter.IComputer target = new SituationSimulation.ObjectAdapter.Transformer(); target.GetVoltage(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
結果以下:
因爲適配器類是適配者類的子類,所以能夠在適配器類中置換一些適配者的方法,使得適配器的靈活性更強。
一個對象適配器能夠把多個不一樣的適配者適配到同一個目標,也就是說,同一個適配器能夠把適配者類和它的子類都適配到目標接口。
對於Java、C#等不支持多重繼承的語言,一次最多隻能適配一個適配者類,並且目標抽象類只能爲抽象類,不能爲具體類,其使用有必定的侷限性,不能將一個適配者類和它的子類都適配到目標接口。
與類適配器模式相比,要想置換適配者類的方法就不容易。若是必定要置換掉適配者類的一個或多個方法,就只好先作一個適配者類的子類,將適配者類的方法置換掉,而後再把適配者類的子類當作真正的適配者進行適配,實現過程較爲複雜。
在如下狀況下可使用適配器模式: