概念
把一個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法一起工作的兩個類能夠在一起工作。介面卡模式有類的介面卡模式和物件的介面卡模式兩種形式。前者類之間的耦合度比後者高,且要求程式設計師瞭解現有元件庫中的相關元件的內部結構,所以應用相對較少些。
優缺點
優點:
1、將目標類和適配者類解耦,通過引入一個介面卡類來重用現有的適配者類,無需修改原有結構。
2、增加了類的透明性和複用性,將具體的業務實現過程封裝在適配者類中,對於客戶端類而言是透明的,而且提高了適配者的複用性,同一適配者類可以在多個不同的系統中複用。
3、靈活性和擴充套件性都非常好,通過使用配置檔案,可以很方便的更換介面卡,也可以在不修改原有程式碼的基礎上 增加新的介面卡,完全複合開閉原則。
缺點:
1、一次最多隻能適配一個適配者類,不能同時適配多個適配者。
2、適配者類不能為最終類,在C#中不能為sealed類
3、目標抽象類只能為介面,不能為類,其使用有一定的侷限性。
模式的結構
介面卡模式(Adapter)包含以下主要角色。
目標(Target)介面:當前系統業務所期待的介面,它可以是抽象類或介面。
適配者(Adaptee)類:它是被訪問和適配的現存元件庫中的元件介面。
介面卡(Adapter)類:它是一個轉換器,通過繼承或引用適配者的物件,把適配者介面轉換成目標介面,讓客戶按目標介面的格式訪問適配者。
實現模式
假如用的是蘋果手機,但是沒有蘋果充電線,有華為充電線,那麼要使用華為充電線給蘋果手機充電,此時就需要一個介面進行轉換,介面卡模式就是用來完成這種轉換的。接下來進行具體實現:
類的介面卡模式
namespace 介面卡
{
/// 華為充電線 typec 蘋果充電線 Lightning
class Client
{
/// <summary>
/// 使用華為充電線給蘋果手機充電
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
ILightning apple = new Apple();
apple.Recharge();
Console.ReadLine();
}
}
/// <summary>
/// 蘋果充電線介面
/// </summary>
public interface ILightning
{
void Recharge();
}
/// <summary>
/// 華為充電線
/// </summary>
public class TypeC
{
public virtual void HuaweiRecharge()
{
Console.WriteLine("華為手機充電");
}
}
/// <summary>
/// 實現蘋果手機充電
/// </summary>
public class Apple : TypeC, ILightning
{
public void Recharge()
{
this.HuaweiRecharge();
}
}
}
以上程式碼實現圖:
物件的介面卡模式
namespace 介面卡
{
class Client
{
static void Main(string[] args)
{
Lightning apple = new Lightning();
apple.Recharge();
Console.ReadKey();
}
}
public class TypeC
{
public void HuaweiRecharge()
{
Console.WriteLine("華為手機充電");
}
}
public class Lightning : TypeC
{
public TypeC tc = new TypeC();
public void Recharge()
{
tc.HuaweiRecharge();
}
}
}
以上程式碼實現圖:
應用場景
介面卡模式(Adapter)通常適用於以下場景。
1、系統需要複用現有類,而該類的介面不符合系統的需求;
2、想要建立一個可重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作;
3、對於物件介面卡模式,在設計裡需要改變多個已有子類的介面,如果使用類的介面卡模式,就要針對每一個子類做一個介面卡,而這不太實際。
模式的擴充套件
介面卡模式(Adapter)可擴充套件為雙向介面卡模式,雙向介面卡類既可以把適配者介面轉換成目標介面,也可以把目標介面轉換成適配者介面,其結構圖如下。