概述:
在軟體開發過程中,我們要經常要複用我們以前開發的一些“現存對象”,但是這些“現存對象”並不能滿足我們新的應用環境。怎樣才能良好的複用這些對象,以滿足我們的應用環境,這就是適配器(Adapter)所要解決的問題。
意圖:
將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
——《設計模式》GOF
生活中的例子:
在現實生活中,像這種適配器我們經常見到,而且還是經常使用它,如:手機(深信大家都見過),我們手機在充電的時候,不可能直接在220V電源上直接充
電,而是手機“充電器”進行轉換成手機需要的電壓才可以正常充電,否則就不可以完成充電,這個“充電器”就起到了適配的作用。
1。類的Adapter模式結構圖
類結構圖:
代碼實現:
namespace Adapter_Pattern
{
public interface ITarget
{
void GetPower();
}
/**//// <summary>
/// 220V電源類;
/// </summary>
public class Power
{
/**//// <summary>
/// 從電源中得到220V的電壓;
/// </summary>
public void GetPoer220V()
{
}
}
/**//// <summary>
/// 適配器類(充電器);
/// </summary>
public class Adapter : Power, ITarget
{
/**//// <summary>
/// 得到想要電壓;
/// </summary>
public void GetPower()
{
this.GetPoer220V();
Console.WriteLine("得到手機的充電電壓!");
}
}
用戶端調用:
namespace Adapter_Pattern
{
class Program
{
/**//// <summary>
/// 這裡相當於是手機;
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Console.Write("手機:");
ITarget Target = new Adapter();
Target.GetPower();
Console.Read();
}
}
}
特點:
它使用多繼承的方式來實現,我們只需要調用得到電壓(GetPower())方法,由充電器(Adapter)去將200V的電壓轉成我們需要的電壓供我們使用。
2.對象的Adapter模式結構圖
類結構圖:
代碼實現:
namespace Adapter_Pattern_Object_
{
public interface ITarget
{
void GetPower();
}
/**//// <summary>
/// 220V電源類
/// </summary>
public class Power
{
/**//// <summary>
/// 得到220V電壓;
/// </summary>
public void GetPoer220V()
{
//在這是220V的電壓;
}
}
/**//// <summary>
/// 適配器類(充電器)
/// </summary>
public class Adapter : ITarget
{
Power power;
/**//// <summary>
/// 適配器的建構函式;
/// </summary>
/// <param name="power">要適配的電壓</param>
public Adapter(Power power)
{
this.power = power;
}
/**//// <summary>
/// 得到想要的電壓;
/// </summary>
public void GetPower()
{
power.GetPoer220V();
Console.WriteLine("得到手機的充電電壓!");
}
}
}
用戶端調用:
namespace Adapter_Pattern_Object_
{
class Program
{
/**//// <summary>
/// 這裡相當於手機;
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Console.Write("手機:");
Power power=new Power();
ITarget Target = new Adapter(power);
Target.GetPower();
Console.Read();
}
}
}
總結:
對於此例子,我們要對手機充電,電力部門不可能給我們提供我們需要的電壓,有時候也不一定滿足我們的需要,這個就是要我們自己進行轉換,這就用到適配器(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模式,就可以充分享受進行類庫遷移、類庫重用所帶來的樂趣,以達到更好的複用。
轉自:
http://www.cnblogs.com/houleixx/archive/2008/03/04/1090214.html