1. 程式人生 > >設計模式第5篇:介面卡模式

設計模式第5篇:介面卡模式

一.介面卡模式要解決的問題

介面卡模式屬於結構設計模式,我們把將兩個不相關的介面做一個適配以使二者進行互動的介面成為介面卡。比如充電器就是一個介面卡,正常電源是120V,手機電池輸入電壓是3V,電瓶車電池輸入電壓為20V,空調輸入電壓為120V,通過介面卡適配,可以將120V電源轉換為3V、20V、120V電源給各種用電裝置充電,下面我們就以電源電壓介面卡為例說明介面卡模式。

首先需要一個電壓類來描述電壓,如下:

class Volt {

    private int volts;
    
    public Volt(int v){
        this.volts=v;
    }

    
public int getVolts() { return volts; } public void setVolts(int volts) { this.volts = volts; } }

現在,我們有一個家庭電源,電壓為120V,該電源描述如下:

class Socket {

    public Volt getVolt(){
        return new Volt(120);
    }
}

現在我們需要構建一個能夠產生3種電壓(3V、20V、120V)的電源介面卡,下面先建立一個能產生這3種電壓的介面卡介面:

public interface SocketAdapter {

    public Volt get120Volt();
        
    public Volt get12Volt();
    
    public Volt get3Volt();
}

 

二.介面卡模式的兩種實現方式

     1.類介面卡模式

     類介面卡模式通過繼承和擴充套件源介面來實現,在這裡就是繼承和擴充套件Socket類。    

class SocketClassAdapterImpl extends Socket implements
SocketAdapter{ @Override public Volt get120Volt() { return getVolt(); } @Override public Volt get20Volt() { return changeVolt(getVolt(),6); } @Override public Volt get3Volt() { return changeVolt(getVolt(),40); } public Volt changeVolt(Volt volt,int i){ int volts=volt.getVolts(); return new Volt(volts/i); } }

        2.物件介面卡模式

    物件介面卡模式通過組合,將源類引入介面卡類中。

class SocketObjectAdapterImpl implements SocketAdapter{
   //源類socket被引入進來
Socket socket
=new Socket(); @Override public Volt get120Volt() { return socket.getVolt(); } @Override public Volt get20Volt() { return changeVolt(socket.getVolt(),6); } @Override public Volt get3Volt() { return changeVolt(socket.getVolt(),40); } public Volt changeVolt(Volt volt,int i){ int volts=volt.getVolts(); return new Volt(volts/i); } }

兩個介面卡類的測試如下:

public class AdapterTest{
    public static void main(String[] args) {
        socketClassAdapterTest();
        socketObjectAdapterTest();
    }
    private static void socketClassAdapterTest(){
        SocketAdapter classAdapter = new SocketClassAdapterImpl();
        Volt volt3=getAdapterVolt(classAdapter,3);
        Volt volt20=getAdapterVolt(classAdapter,20);
        Volt volt120=getAdapterVolt(classAdapter,120);
        System.out.println("3V:"+volt3.getVolts());
        System.out.println("20V:"+volt20.getVolts());
        System.out.println("120V:"+volt120.getVolts());
    }
    private static void socketObjectAdapterTest(){
        SocketAdapter objectAdapter = new SocketObjectAdapterImpl();
        Volt volt3=getAdapterVolt(objectAdapter,3);
        Volt volt20=getAdapterVolt(objectAdapter,20);
        Volt volt120=getAdapterVolt(objectAdapter,120);
        System.out.println("3V:"+volt3.getVolts());
        System.out.println("20V:"+volt20.getVolts());
        System.out.println("120V:"+volt120.getVolts());
    }
    private static Volt getAdapterVolt(SocketAdapter adapter,int volts){
        switch (volts){
            case 120:return adapter.get120Volt();
            case 20:return adapter.get20Volt();
            case 3:return adapter.get3Volt();
            default:return adapter.get120Volt();
        }
    }
}