設計模式-適配器模式

生活中的例子

如上圖所示,生活中適配器無處不在,如電源適配器,讀卡器,甚至多轉接頭讀卡器等,都是很常見的例子,它們的目的都是將本來不能一塊兒工做的部件可以在一塊兒工做。
在軟件工程領域的適配器也是一樣相似的做用。git

定義

適配器模式是將一個類的接口轉換成客戶但願的另一個接口,即將本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。github

示例

這裏就以一個簡單的讀卡器的例子來加以說明。一般在咱們使用SD卡存儲文件時,會存在以下狀況:code

  1. 電腦只有USB接口,不能直接插入SD卡;
  2. 電腦和SD卡都是成型的產品,不可能改造電腦或者讀卡器。

所以,咱們須要在中間實現一個轉換器,也就是讀卡器。具體關係圖以下:blog

不難發現,電腦(Computer)和讀卡器(SdReader)都實現了USB接口(IUsb),而讀卡器又聚合了SD卡,也就是SD卡隨時能夠插到讀卡器上。具體實現代碼以下:接口

public interface IUsb
{
    void Request();
}

public class Sd
{
    public void ReadWrite()
    {
        Console.WriteLine("存取數據");
    }
}

public class Computer
{
    private IUsb _usb;

    public void SetUsb(IUsb usb)
    {
        _usb = usb;
    }

    public void ConnectUsb()
    {
        if (_usb != null)
        {
            _usb.Request();
        }
    }
}

public class SdReader : IUsb
{
    private Sd _sd;

    public SdReader(Sd sd)
    {
        _sd = sd;
    }

    public void Request()
    {
        _sd.ReadWrite();
    }
}

其中,USB接口(IUsb)、電腦(Computer)還有SD卡(Sd)都是不可變,而讀卡器(SdReader)的目的就是爲了讓SD卡(Sd)可以適配USB接口(IUsb)而額外增長的部分。get

UML類圖

將上述類圖進行簡單的抽象就能夠獲得以下UML類圖,,這就是適配器模式:源碼

  • Target:目標接口,咱們指望的接口
  • Adapter:適配器,將被適配者轉換成咱們指望的形式
  • Adaptee: 被適配者,原有的接口

優缺點

優勢

  1. 可讓任何兩個沒有關聯的類一塊兒運行。
  2. 提升了類的複用。
  3. 經過引入一個適配器類來重用現有的類,而無須修改原有結構,遵照了開閉原則

缺點

過多地使用適配器,會讓系統很是零亂,不易總體進行把握。產品

總結

適配器模式雖然可讓任何兩個沒有關聯的類一塊兒運行,可是卻屬於補償機制,專門用來在系統後期擴展、修改時使用,屬於無可奈何的作法。所以,適配器模式也不宜過分使用,若是能夠的話,咱們應該優先經過重構解決,即讓被適配的兩個類一開始就能夠一塊兒工做或許會更好。it

源碼連接class

相關文章
相關標籤/搜索