本文爲原創作品,轉載請註明出處!
適配器模式(有時候也稱包裝樣式或者包裝)將一個類的接口適配成用戶所期待的。一個適配允許通常因爲接口不兼容而不能在一起工作的類工作在一起,做法是將類自己的接口包裹在一個已存在的類中。
適配器模式按種類劃分共分爲兩種:
一、類適配器模式
類圖:
首先,我們定義一個適配器接口類:
public interface DataOperation {
public abstract int[] sort(int[] array0); //排序方法
public abstract int search(int[] array1, int key); //查找方法
}
此處我們將二分查找算法和快速排序算法“合併”到一個類中,並作爲適配的類:
public class SortandSearch {
public int[] quickSort(int[] array) {
QuickSort qSort = new QuickSort(); //快速排序
return qSort.quickSort(array);
}
public int binarySearch(int[] array, int key) {
BinarySearch bSearch = new BinarySearch(); //二分查找
return bSearch.binarySearch(array, key);
}
}
接着我們就可以定義最主要的適配器類了:
public class ArrayAdapter extends SortandSearch implements DataOperation{
public int[] sort(int[] array0) {
// TODO 自動生成的方法存根
return super.quickSort(array0); //繼承類SortandSearch的方法
//並在DataOperation接口中實現
}
public int search(int[] array1, int key) {
// TODO 自動生成的方法存根
return super.binarySearch(array1, key);
}
}
類圖:
接口以及實現類與類適配器大同小異,區別就在於適配器類的構造:
public class ArrayAdapter implements DataOperation {
QuickSort qSort; //創建QuickSort對象
BinarySearch bSearch; //創建BinarySearch對象
public ArrayAdapter() {
this.qSort = new QuickSort(); //調用QuickSort類
this.bSearch = new BinarySearch(); //調用BinarySearch類
}
public int[] sort(int[] array0) { //在DataOperation中實現sort方法
// TODO 自動生成的方法存根
return qSort.quickSort(array0);
}
public int search(int[] array1, int key) { //在DataOperation中實現search方法
// TODO 自動生成的方法存根
return bSearch.binarySearch(array1, key);
}
}
其實兩者最大的區別就是在於適配器類中對於已經存在的其他接口中方法的調用,類適配器是繼承的方式調用,而對象適配器則是創建被調用方法的對象,然後直接調用。歸根結底,適配器模式是將接口不同而功能相近的兩個接口加以轉換,包括適配器角色補充一些源角色沒有但目標接口需要的方法。
在Java語言中,使用對象適配器模式可以把多種不同的源類都適配到同一個Target接口,而使用類的適配器模式是做不到這一點的(因爲Java中子類只允許直接繼承一個父類)。如果一個被適配源類中有大量的方法,使用類適配器模式比較容易,只需要讓Adapter類繼承被適配的源類即可。而此時使用對象適配器模式則要在Adapter類中明確寫出Target角色中的每個方法,並且在每個方法中要一一調用被適配的源類中的相應方法。