輕鬆學習適配器模式(Adapter Pattern)
適配器模式(Adapter Pattern)
以下內容是我和小組的兄弟學習設計模式我做的課件,我整理出來和大家分享,有不妥之處敬請指出.
上次做的橋接模式(Bridge),這次是適配器模式(Adapter).
概述:
在軟件開發過程中,我們要經常要複用我們以前開發的一些“現存對象”,但是這些“現存對象”並不能滿足我們新的應用環境。怎樣才能良好的複用這些對象,以滿足我們的應用環境,這就是適配器(Adapter)所要解決的問題。
意圖:
將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。
——《設計模式》GOF
生活中的例子:
在現實生活中,像這種適配器我們經常見到,而且還是經常使用它,如:手機(深信大家都見過),我們手機在充電的時候,不可能直接在220V電源上直接充電,而是手機“充電器”進行轉換成手機需要的電壓纔可以正常充電,否則就不可以完成充電,這個“充電器”就起到了適配的作用。
1.類的Adapter模式結構圖
類結構圖:
代碼實現:
2{
3 public interface ITarget
4 {
5 void GetPower();
6 }
7 /**//// <summary>
8 /// 220V電源類;
9 /// </summary>
10 public class Power
11 {
12 /**//// <summary>
13 /// 從電源中得到220V的電壓;
14 /// </summary>
15 public void GetPoer220V()
16 {
17
18 }
19 }
20 /**//// <summary>
21 /// 適配器類(充電器);
22 /// </summary>
23 public class Adapter : Power, ITarget
24 {
25 /**//// <summary>
26 /// 得到想要電壓;
27 /// </summary>
28 public void GetPower()
29 {
30 this.GetPoer220V();
31 Console.WriteLine("得到手機的充電電壓!");
32 }
33 }
客戶端調用:
2{
3 class Program
4 {
5 /**//// <summary>
6 /// 這裏相當於是手機;
7 /// </summary>
8 /// <param name="args"></param>
9 static void Main(string[] args)
10 {
11 Console.Write("手機:");
12 ITarget Target = new Adapter();
13 Target.GetPower();
14 Console.Read();
15 }
16 }
17}
特點:
它使用多繼承的方式來實現,我們只需要調用得到電壓(GetPower())方法,由充電器(Adapter)去將220V的電壓轉成我們需要的電壓供我們使用。
2.對象的Adapter模式結構圖
類結構圖:
代碼實現:
2{
3 public interface ITarget
4 {
5 void GetPower();
6 }
7 /**//// <summary>
8 /// 220V電源類
9 /// </summary>
10 public class Power
11 {
12 /**//// <summary>
13 /// 得到220V電壓;
14 /// </summary>
15 public void GetPoer220V()
16 {
17 //在這是220V的電壓;
18 }
19 }
20 /**//// <summary>
21 /// 適配器類(充電器)
22 /// </summary>
23 public class Adapter : ITarget
24 {
25 Power power;
26 /**//// <summary>
27 /// 適配器的構造函數;
28 /// </summary>
29 /// <param name="power">要適配的電壓</param>
30 public Adapter(Power power)
31 {
32 this.power = power;
33 }
34 /**//// <summary>
35 /// 得到想要的電壓;
36 /// </summary>
37 public void GetPower()
38 {
39 power.GetPoer220V();
40 Console.WriteLine("得到手機的充電電壓!");
41 }
42 }
43}
44
客戶端調用:
2{
3 class Program
4 {
5 /**//// <summary>
6 /// 這裏相當於手機;
7 /// </summary>
8 /// <param name="args"></param>
9 static void Main(string[] args)
10 {
11 Console.Write("手機:");
12
13 Power power=new Power();
14 ITarget Target = new Adapter(power);
15 Target.GetPower();
16
17 Console.Read();
18 }
19 }
20}
總結:
對於此例子,我們要對手機充電,電力部門不可能給我們提供我們需要的電壓,有時候也不一定滿足我們的需要,這個就是要我們自己進行轉換,這就用到適配器(Adapter)。
對軟件系統中,如果要複用以前的“現存對象”,但是這些對象所提供的接口並不一定能適應我們的新環境,我們就要對其轉換成我們需要的接口,來供我們調用。
Adapter在.NET中的應用:
在ADO.NET中,對於我們從數據庫中取出的數據都要放到一個DataSet中,不管你是Access的數據庫,還是SQL的數據庫,或者是Oracle的數據庫都要放到DataSet中。.NET中並沒有提供如:SqlDataSet、OleDbDataSet、OracleDataSet等,它只提供了一種DataSet就是用SqlDataAdapte等去填充數據;爲什麼這一個DataSet能存放不同的數據呢?就是有這些適配器來適配。
DataAdapter結構圖:
要點:
1.Adapter模式主要應用於“希望複用一些現存的類,但是接口又與複用環境要求不一致的情況”,在遺留代碼複用、類庫遷移等方面非常有用。
2.Adapter模式有對象適配器和類適配器兩種形式的實現結構,但是類適配器採用“多繼承”的實現方式,帶來了不良的高耦合,所以一般不推薦使用。對象適配器採用“對象組合”的方式,更符合鬆耦合精神。適用性:
在以下各種情況下使用適配器模式:
1.系統需要使用現有的類,而此類的接口不符合系統的需要。
2.想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。這些源類不一定有很複雜的接口。
3.(對對象適配器而言)在設計裏,需要改變多個已有子類的接口,如果使用類的適配器模式,就要針對每一個子類做一個適配器,而這不太實際。
總結:
總之,通過運用Adapter模式,就可以充分享受進行類庫遷移、類庫重用所帶來的樂趣,以達到更好的複用。