Java設計模式(4)之介面卡模式學習總結

boker_han發表於2017-10-25

前言

    由於專案工程中,常常會出現現存的類與所需求的類之間型別不相容,但是現存的類又具有所需求類的功能,所以為了能夠重用現存的類,解決專案
中的需求,介面卡模式就應運而生了。

    簡而言之,介面卡模式就是在目標類與現存類之間搭起一道橋樑(介面卡類),使得可以使用現存的類來適應目標介面,這樣就不要再為目標類的
不存在,而專門去設計一個目標類,或者修改已有的介面(類)以適應現存的類,從而遵循了開閉原則(對擴充套件開放,對修改關閉)!

    下面通過一個實際生活中遇到的情景,來講解介面卡模式的原理及應用。當一個人手機沒電時,周圍只有一個220V的電源,但是手機的充電介面是
5V的,所以220V的電源不能直接用來給手機充電,所以這時需要一個介面卡來將220V電源適配給手機介面進行充電。在這個例子中,220V的電源的功
能是充電,5V的電源也能充電,所以可以採用介面卡模式,解決這個型別不相容問題。 

    在這個情境中,你不能因為沒有5V的電源,就將手機的充電介面改為220V的吧!如果這樣做的話,遇到其他情況,你豈不是還得把介面改掉?
所以這時需要一個介面卡,將不是5V的電源轉換為5V的電源不就可以解決問題了!而且以後如果遇到只有100V電源的情況,你也可以通過電源
介面卡將100V的電源轉換為5V電源,這樣,保證了充電介面不被改變,可以一直使用,同時又利用了現存的電源!

    以下程式碼分別對應220V的電源類(ExistedUtil類)、5V的充電介面( Target介面)、手機類( Client)以及電源介面卡類(Adapter類);
    /**
     *目標介面,本例中為手機的5V充電介面
     */
    public interface Target
        {
            void functionTarget();//充電的功能
        }
    /**
     *現有的類,本例中為220V電源類
     */ 
    public class ExistedUtil
        {
            public void function()
                {
                    System.out.println("完成functionTarget方法中的所有功能");
                }
        }
    /**
     *客戶端,本例中為手機類
     */ 
    public class Client
        {
            private Target target;
            public Client(Target t)
            {
                target = t;
            }
        }
    /**
     *介面卡類,本例中為電源介面卡類
     */ 
    public class Adapter implements Target
        {
            private ExistedUtil eu;
            public Adapter(ExistedUtil existedUtil)
            {
                eu = existedUtil;
            }
            @Override
            public void functionTarget()
            {
                this.function();
            }
        }
    /**
     *main方法,用於測試使用
     */ 
    public static void main(String[] args)
        {
        //使用介面卡之前
            ExistedUtil eu = new ExistedUtil();//220V電源
            Client c = new Client(eu);//只能放5V的電源,eu為220V電源,此處編譯不通過
        //使用介面卡之後   
            ExistedUtil eu = new ExistedUtil();//220V電源
            Target t = new Adapter(eu);//5V的電源
            Client c = new Client(t);
        }

上述程式碼採用的是採用組合方式的介面卡,該介面卡為物件介面卡,原因在於該介面卡是將現存類的一個物件放入介面卡類中作為資料域;還有另外一種介面卡,叫做類介面卡,類介面卡採用介面卡類繼承於現存類的方式進行設計;

這裡只需將介面卡類做一定的修改,如下所示:

    /**
     *介面卡類,本例中為電源介面卡類
     */ 
     public class Adapter extends ExistedUtil implements Target
    {
        @Override
        public void functionTarget()
        {
            super.function();
        }
    }
    /**
     *main方法,用於測試使用
     */ 
    public static void main(String[] args)
    {
        Target t = new Adapter();//5V的電源
        Client c = new Client(t);
    }

兩種方式的區別:

    物件介面卡:將被適配者作為一個物件組合到介面卡類中,將被適配者包裝到介面卡中,提供給目標介面使用;可以提供給多個被適配者進行適配;
    類介面卡:通過繼承被適配者類,實現對目標介面的匹配,只能為某一特定的類實現適配;

相關文章