本文为原创作品,转载请注明出处!
适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
适配器模式按种类划分共分为两种:
一、类适配器模式
类图:
首先,我们定义一个适配器接口类:
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角色中的每个方法,并且在每个方法中要一一调用被适配的源类中的相应方法。