[設計模式] 結構型:適配器模式(Adapter Pattern)

什麼是適配器模式

想理解適配器模式,就要先知道什麼是適配器。

手機充電器能夠將家用220V電壓轉換成5V電壓,給手機充電,充電器就是個適配器,電壓適配器。

手機能夠感知到適配器提供的5V電壓,但卻無法感知到適配器背後的220V電壓。

“適配”就意味着信息轉換,將現有信息狀態轉換成另一種信息狀態。做轉換工作的就是適配器,目的是爲了重用現有的東西。

具體到代碼設計層面,就是要重複利用現有代碼,屬於重複利用代碼的一種設計模式。

適配器模式有一個比較特別的地方,那就是使用適配器模式,不會新增加系統的實體概念。

語言說不太明白,具體看下文代碼理解吧,其實很簡單。

適配器模式設計與實現

適合使用適配器模式的核心要點就是一個:

能夠花費較小代價,將一個已經實現的東西,轉換成另一個需要的東西

還是拿220V電壓轉5V電壓的適配器舉例吧,有兩種實現方式:類適配器、對象適配器。

類適配器

這種實現方式,是利用了編程語言的多繼承機制,C++是多繼承的,所以可以很方便的實現,但是Java就會受限制,因爲Java只支持單繼承,不支持多繼承。

因此,如果是Java語言,儘量不要使用類適配器的實現方式。

// 電壓
public interface Voltage {
    public int output();
}

// 220V:國家花大力氣實現的
public class Voltage220 implements Voltage {
    @Override
    public int output() {
        return 220;
    }
}

// 5V:我現在需要的,用適配器模式轉換
public class Voltage5 extends Voltage220 implements Voltage {
    @Override
    public int output() {
        int output = super.output();// 國家的220V
        return output / 44;// 轉換成5V
    }
}

Voltage5滿足需求,提供了5V電壓,但是電壓它不是自己實現的,它是藉助了Voltage220,使用適配器模式將其轉換成了需要的。

這就是適配器模式,沒什麼複雜的哈。

對象適配器

這種實現方式,使用的是對象聚合的概念,沒有使用多繼承機制,所以這是Java語言的首選實現方式,C++隨意。

// 電壓
public interface Voltage {
    public int output();
}

// 220V:國家花大力氣實現的
public class Voltage220 implements Voltage {
    @Override
    public int output() {
        return 220;
    }
}

// 5V:我現在需要的,用適配器模式轉換
public class Voltage5 implements Voltage {
    private Voltage voltage;// 國家實現

    public Voltage5(Voltage voltage) {
        this.voltage = voltage;
    }

    @Override
    public int output() {
        int output = voltage.output();// 國家的220V
        return output / 44;// 轉換成5V
    }
}

對象適配器的實現方式不涉及繼承機制,實現較爲靈活,實現類的耦合性也比較低,建議首選。

總結

適配器模式特別簡單,很多人都在用,但是很多人並不知道自己在用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章