介面卡模式介紹
介面卡模式的作用就是把原本不相容的介面,通過適配修改到統一的過程,使得使用者方便使用。
在實際工作中, 有時候我們需要把各個業務線的各種型別服務做統一的包裝,再對外提供介面進行使用。
介面卡模式要解決的主要問題就是多種差異化型別的介面做統一輸出。
介面卡可擔任兩個物件間的封裝器,它會接收對於一個物件的呼叫,並將其轉換為另一個物件可識別的格式和介面。
介面卡模式通過封裝物件將複雜的轉換過程隱藏於幕後。被封裝的物件甚至察覺不到介面卡的存在。
介面卡模式結構
- 物件介面卡
構成原則:介面卡實現其中一個物件的介面,並對另一個物件進行封裝。
1、客戶端:包含當前程式業務邏輯的類。
2、客戶端介面:描述了其他類與客戶端程式碼合作時必須遵循的協議。
3、服務:其中的有些功能類或方法,客戶端無法直接呼叫其功能,無法進行使用。
4、介面卡:可以同時與客戶端和服務互動的類,它在實現客戶端介面的同時封裝了服務物件。介面卡接受客戶端通過介面卡介面發起的呼叫,並將其轉換為適用於被封裝服務物件的呼叫。
客戶端程式碼只需通過介面與介面卡互動即可,無需與具體的介面卡耦合。這在服務類介面被更改或替換時很有用,你無需修改客戶端程式碼就可以建立新的介面卡類。
- 類介面卡
通過繼承機制,介面卡同時繼承兩個物件的介面。此種方式只在支援多重繼承的程式語言中實現,例如C++
類介面卡不需要封裝任何物件,因為它同時繼承了客戶端和服務的行為。適配功能在重寫的方法中完成,最好生成的介面卡可替代已有的客戶端類進行使用。
介面卡模式優缺點
優點:
-
使得程式碼乾淨整潔,易於維護,減少大量重複的判斷和使用,讓程式碼更加易於維護和擴充套件。
-
單一職責原則,可以將介面或資料轉換程式碼從程式主要業務邏輯中分離。
-
開閉原則,客戶端程式碼通過客戶端介面與介面卡進行互動,你就能在不修改現有客戶端程式碼的情況下在程式中新增新型別的介面卡。
缺點:
- 程式碼複雜度增加,需要增加很多介面和類
Demo
/// <summary>
/// 介面類,客戶端類
/// </summary>
public interface ITarget
{
string GetRequest();
}
/// <summary>
/// 被適配者 例如遺留老程式碼,開源模組等
/// </summary>
public class Adaptee
{
public string GetSpecificRequest()
{
return "特殊的請求 遺留的老程式碼";
}
}
/// <summary>
/// 介面卡
/// </summary>
public class Adapter:ITarget
{
private readonly Adaptee _adaptee;
public Adapter(Adaptee adaptee)
{
this._adaptee = adaptee;
}
/// <summary>
/// 顯示實現的介面類
/// 在這裡可以呼叫遺留老程式碼的方法。
/// </summary>
/// <returns></returns>
public string GetRequest()
{
return "我正在呼叫:" + _adaptee.GetSpecificRequest();
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Start Test Adapter Mode");
//例項化老程式碼模組
Adaptee tempAdaptee = new Adaptee();
ITarget adapter = new Adapter(tempAdaptee);
//通過實現的介面去呼叫老程式碼模組中的方法。
var showResult=adapter.GetRequest();
Console.WriteLine(showResult);
Console.ReadKey();
}
}
可以看到在上述程式碼中,我們通過介面卡去直接呼叫的老程式碼中的方法。在我們平時的開發過程中,介面卡使用的場景還是很多的,比如系統對開源元件的支援,多裝置的支援等。對於設計模式而言,要學會注意它的使用場景,也只有在合適的場景下使用它,才能發揮它最大的效果。
介面卡可以通過以不同抽象或介面例項為引數的建構函式來識別。當介面卡的任何方法被呼叫時,它會將引數轉換為合適的格式,然後將呼叫定向到其封裝物件中的一個或多個方法。
小寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
原創不易,給個關注唄。
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。