C#設計模式-適配器模式(Adapter Pattern)

概念

把一個類的接口變換成客戶端所期待的另外一種接口,從而使本來接口不匹配而沒法一塊兒工做的兩個類可以在一塊兒工做。適配器模式有類的適配器模式和對象的適配器模式兩種形式。前者類之間的耦合度比後者高,且要求程序員瞭解現有組件庫中的相關組件的內部結構,因此應用相對較少些。程序員

優缺點

  優勢:app

    一、將目標類和適配者類解耦,經過引入一個適配器類來重用現有的適配者類,無需修改原有結構。this

    二、增長了類的透明性和複用性,將具體的業務實現過程封裝在適配者類中,對於客戶端類而言是透明的,並且提升了適配者的複用性,同一適配者類能夠在多個不一樣的系統中複用。spa

    三、靈活性和擴展性都很是好,經過使用配置文件,能夠很方便的更換適配器,也能夠在不修改原有代碼的基礎上 增長新的適配器,徹底複合開閉原則。設計

  缺點:code

    一、一次最多隻能適配一個適配者類,不能同時適配多個適配者。對象

    二、適配者類不能爲最終類,在C#中不能爲sealed類blog

    三、目標抽象類只能爲接口,不能爲類,其使用有必定的侷限性。繼承

模式的結構

適配器模式(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)一般適用於如下場景。
一、系統須要複用現有類,而該類的接口不符合系統的需求;
二、想要創建一個可重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在未來引進的類一塊兒工做;
三、對於對象適配器模式,在設計裏須要改變多個已有子類的接口,若是使用類的適配器模式,就要針對每個子類作一個適配器,而這不太實際。

模式的擴展

適配器模式(Adapter)可擴展爲雙向適配器模式,雙向適配器類既能夠把適配者接口轉換成目標接口,也能夠把目標接口轉換成適配者接口,其結構圖以下。

相關文章
相關標籤/搜索