1. 程式人生 > >Android開發之設計模式-介面卡模式

Android開發之設計模式-介面卡模式

介面卡模式(Adapter Pattern)

是作為兩個不相容的介面之間的橋樑。這種型別的設計模式屬於結構型模式,它結合了兩個獨立介面的功能。

這種模式涉及到一個單一的類,該類負責加入獨立的或不相容的介面功能。舉個真實的例子,讀卡器是作為記憶體卡和筆記本之間的介面卡。您將記憶體卡插入讀卡器,再將讀卡器插入筆記本,這樣就可以通過筆記本來讀取記憶體卡。

定義:將一個類的介面轉換成客戶希望的另外一個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。

主要解決:主要解決在軟體系統中,常常要將一些"現存的物件"放到新的環境中,而新環境要求的介面是現物件不能滿足的。

何時使用:

 1、系統需要使用現有的類,而此類的介面不符合系統的需要。 2、想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作,這些源類不一定有一致的介面。 3、通過介面轉換,將一個類插入另一個類系中。(比如老虎和飛禽,現在多了一個飛虎,在不增加實體的需求下,增加一個介面卡,在裡面包容一個虎物件,實現飛的介面。)

如何解決:繼承或依賴(推薦)。

關鍵程式碼:介面卡繼承或依賴已有的物件,實現想要的目標介面。

應用例項: 1、美國電器 110V,中國 220V,就要有一個介面卡將 110V 轉化為 220V。 2、JAVA JDK 1.1 提供了 Enumeration 介面,而在 1.2 中提供了 Iterator 介面,想要使用 1.2 的 JDK,則要將以前系統的 Enumeration 介面轉化為 Iterator 介面,這時就需要介面卡模式。 3、在 LINUX 上執行 WINDOWS 程式。 4、JAVA 中的 jdbc。

優點: 1、可以讓任何兩個沒有關聯的類一起執行。 2、提高了類的複用。 3、增加了類的透明度。 4、靈活性好。

缺點: 1、過多地使用介面卡,會讓系統非常零亂,不易整體進行把握。比如,明明看到呼叫的是 A 介面,其實內部被適配成了 B 介面的實現,一個系統如果太多出現這種情況,無異於一場災難。因此如果不是很有必要,可以不使用介面卡,而是直接對系統進行重構。 2.由於 JAVA 至多繼承一個類,所以至多隻能適配一個適配者類,而且目標類必須是抽象類。

使用場景:有動機地修改一個正常執行的系統的介面,這時應該考慮使用介面卡模式。

注意事項:介面卡不是在詳細設計時新增的,而是解決正在服役的專案的問題。

下面舉一個變壓器的例子。美國的電壓110,中國電壓220,如何把從美國帶回來的電飯煲在中國使用,這就需要用到變壓器進行調節了,變壓器也就是110電壓的電飯煲在220電壓下工作的介面卡。

UML圖:

1、美國的生活電壓110V

/***
 *美國的生活電壓110V
 */
public interface USAVoltage {
     // 目標角色
    // 美國110電壓介面
    void connect();
}

2、110V電壓實現類

/**
 *110電壓實現類
 */
public class USAVoltageImpl implements USAVoltage{
    @Override
    public void connect() {
        System.out.println("110V接通電源,開始工作...");
    }
}

3、中國的生活電壓220V

/**
 * 中國的生活電壓220V
 * */
public interface ChineseVoltage {
    // 源角色
    // 中國220電壓介面
    void connect();
}

4、200V電壓實現類

/**
 * 220電壓實現類
 * */
public class ChineseltageImpl implements ChineseVoltage{
    @Override
    public void connect() {
        System.out.println("220V接通電源,開始工作");
    }
}

5、美國110v的電飯煲

/***
 *110v的電飯煲
 */

public class ElectricCooker {
    //110電飯煲要用110電壓介面
    private USAVoltage usaVoltage;
    public ElectricCooker(USAVoltage usaVoltage){
        super();
        this.usaVoltage = usaVoltage;
    }
    public void cook(){
        usaVoltage.connect();//通電
        System.out.println("開始做飯...");
    }
}

6、電壓介面卡

/**
 * 電壓介面卡
 * 為了能夠適配110V電飯煲的電源介面,我們要繼承110V介面
 * 介面卡角色,實現目標角色介面
 * */
public class PowerAdaptor implements USAVoltage{
    /**繼承110V介面,可以使用美國電飯煲,持有220V電壓引用可以用220V電壓工作*/
    private ChineseVoltage chineseVoltage; // 用220v=介面進行適配

    public PowerAdaptor(ChineseVoltage chineseVoltage){
        super();
        this.chineseVoltage = chineseVoltage;
    }
    @Override
    public void connect() {
        chineseVoltage.connect();
    }
}

7、測試類

/**
 * 測試類
 * */
public class AdapterPatternDemo {
    public static void main(String[] args) {
        ChineseVoltage chineseVoltage = new ChineseltageImpl();//220V電壓

        PowerAdaptor adaptor = new PowerAdaptor(chineseVoltage);//電源適配

        ElectricCooker cooker = new ElectricCooker(adaptor);//使用110V美國電壓

        cooker.cook();//110V的電飯煲接通220V的電壓開始做飯
    }
}

8、執行程式,輸出結果

可以看出,110的電飯煲開始在220電壓下工作了。這就是適配模式。

介面卡模式有兩種形式:類的介面卡模式和物件的介面卡模式

具體詳解,參考以下連結:

下篇代理模式,待續...