適配器模式:
將一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。經常舉的例子是插頭,插座是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();
}
}
類適配器
和對象適配器不同,類適配器器通過繼承原有系統的類,這樣便可任意訪問原有系統中的方法。