1. 程式人生 > 實用技巧 >設計模式:介面卡模式

設計模式:介面卡模式

定義

介面卡模式(adapter),他的功能是將一個類的介面變成客戶端所期望的另一種介面,從而使原本因介面不匹配而導致無法在一起工作的兩個類能夠一起工作,屬於結構型設計模式。

類介面卡

在我國,居民用電是220V交流電,手機鋰電池使用5V直流電,我們這時候就需要電源介面卡來進行轉換,程式碼如下:

//220v交流電
public class AC220 {

    public int outputAC220V(){
        System.out.println("輸出220v交流電");
        return 220;
    }
}

//5V直流電
public interface DC5 {
    int output5V();
}

//電源介面卡
public class PowerAdapter extends AC220 implements DC5{
    @Override
    public int output5V() {
        int ac220V = outputAC220V();
        int dc5 = ac220V/44;
        System.out.println("PowerAdapter : ac220V====>dc"+dc5+"V");
        return dc5;
    }
}

測試:

    public static void main(String[] args) {
        PowerAdapter powerAdapter = new PowerAdapter();
        powerAdapter.output5V();
    }

uml類圖

物件介面卡

物件介面卡通過組合來實現介面卡功能。針對與第一種,只需要修改Adapter

//電源介面卡
public class PowerAdapter implements DC5 {

    private AC220 ac220;

    PowerAdapter(AC220 ac220) {
        if(Objects.isNull(ac220))
            throw new RuntimeException("AC220 null!!!");
        this.ac220 = ac220;
    }

    @Override
    public int output5V() {
        int ac220V = ac220.outputAC220V();
        int dc5 = ac220V/44;
        System.out.println("PowerAdapter : ac220V====>dc"+dc5+"V");
        return dc5;
    }
}

介面介面卡

當介面卡介面眾多時候,如果直接實現介面,會出現很多方法,過於臃腫,我們可以使用抽象類實現介面,空實現介面的各種方法,然後讓子類實現個別適配方法。

//220v交流電
public class AC220 {

    public int outputAC220V(){
        System.out.println("輸出220v交流電");
        return 220;
    }
}
//直流電
public interface DC {
    int output5V();
    int output10V();
    int output20V();
}

//電源介面卡抽象實現
public abstract class PowerAdapter implements DC {

    protected AC220 ac220;

    PowerAdapter(AC220 ac220) {
        if(Objects.isNull(ac220))
            throw new RuntimeException("AC220 null!!!");
        this.ac220 = ac220;
    }

    @Override
    public int output5V() {
        return 0;
    }

    @Override
    public int output10V() {
        return 0;
    }

    @Override
    public int output20V() {
        return 0;
    }
}
//5V電源介面卡(10V和20V省略)
public class Power5VAdapter extends PowerAdapter{
    Power5VAdapter(AC220 ac220) {
        super(ac220);
    }

    @Override
    public int output5V() {
        int ac220V = super.ac220.outputAC220V();
        int dc5 = ac220V/44;
        System.out.println("PowerAdapter : ac220V====>dc"+dc5+"V");
        return 0;
    }
}

測試:

        PowerAdapter powerAdapter = new Power5VAdapter(new AC220());
        powerAdapter.output5V();

類圖: