介面卡模式(Adapter)

weixin_34104341發表於2016-05-20

介面卡模式:
將一個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。經常舉的例子是插頭,插座是2口的,但電器插頭是3口的,若想正常使用電器就需要轉換插頭(3口轉2口),這個轉換插頭就是介面卡。

介面卡適用範圍:
系統需要使用現有的類,而此類的藉口不符合系統的要求
想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。


介面卡模式有兩種實現方式:物件介面卡和類介面卡。區別在於類介面卡用繼承的方式使用原類(介面),而物件介面卡採用委託的方式使用源。


  • 物件介面卡:
    客戶需要使用三插頭電器(客戶),可是插座只是二插頭的(原有系統),故採用三插頭轉二插頭介面卡,目標是使得三插頭電器能夠使用二插頭插座的功能(功能在函式operateA(),operateB()中)。物件介面卡採用委託方式,首先在“二插頭轉三插頭類”中(實現三插頭介面),定義二插頭介面變數(委託物件),以便將實現二插頭物件的引用傳給它,來回撥原有系統中的方法(operateA(),operateB()).

這裡寫圖片描述

//原有系統中的二插頭介面
public interface 二插頭{
    void operateA();
    void operateB();
}
//實現原有系統中介面的而二插頭類
public class 實現介面的二插頭類 implements 二插頭{
    public void operateA(){}//重寫介面方法時,必須加上public。因為介面方法預設型別public abstract
    pubic void operateB(){}
}
//客戶要求的三插頭介面
public interface 三插頭{
    public void operateC();
    pubic void operateD();
}
//物件介面卡,將三插頭轉換而二插頭,本身是一個實現客戶要求的三插頭的類
public class 二插頭轉三插頭類 implements 三插頭{
    二插頭 adpte;//定義原系統中的介面變數(定義委託物件)
    public 二插頭轉三插頭類(二插頭 adpte1){//介面做引數,準備介面回撥:把實現二插頭介面的類建立的物件的引用傳遞給該介面宣告的介面變數引數,那麼該介面變數就可以呼叫被類實現的介面中的方法。
        this.adpte=adpte1;
    }
    public void operateC(){
        //可回撥實現介面的二插頭類中的方法
    }
    public void operateD(){
        //可回撥實現介面的二插頭類中的方法
    }
} 

public class 客戶類{
    public static void main(String[]args){
        二插頭 adpte;
        adpte=new 二插頭轉三插頭類(new 實現介面的二插頭類());//存放物件的引用
        adpte.operateA();
        adpte.operateB();
    }
}

  • 類介面卡

    和物件介面卡不同,類介面卡器通過繼承原有系統的類,這樣便可任意訪問原有系統中的方法。
    這裡寫圖片描述

相關文章