本次适配器模式将以下面例题举例
例题:现有一个接口DataOperation定义了排序方法sort(int [ ])和查找方法search(int [ ], int [ ]),已知类QuickSort的quickSort(int [ ])方法实现了快速排序算法,类BinarySearch 的 binarySearch(int [ ], int )方法实现了二分查找算法。现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中。编程实现。
类图:
相关概念:
- 适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
- 快速排序:快速排序 (Quick Sort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
- 二分查找:二分搜索 (英语:binary search),也称 折半搜索 (英语:half-interval search)、 对数搜索 (英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索 算法
代码实现:
一、DataOperation类(接口):
package 适配器模式;
public interface DataOperation {
public void sort(int[] data, int i, int i1);//排序方法
public void search(int[] list,int key);//查找方法
}
二、OperationAdapter类(接口实现类(适配器类)):
package 适配器模式;
public class OperationAdapter implements DataOperation{
private QuickSort quicksort;
private BinarySearch binarysearch;
public OperationAdapter(QuickSort quicksort,BinarySearch binarysearch) {
this.quicksort = quicksort;
this.binarysearch = binarysearch;
}
@Override
public void sort(int[] data, int low, int height) {
quicksort.quickSort(data,low,height);
}
@Override
public void search(int[] list, int key) {
binarysearch.binarySearch(list,key);
}
}
三、QuickSort类(快排类):
package 适配器模式;
public class QuickSort {
public void quickSort(int[] data,int low,int high){
int i,j,temp,t;
if(low>high){
return;
}
i=low;
j=high;
//temp就是基准位
temp = data[low];
while (i<j) {
//先看右边,依次往左递减
while (temp<=data[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=data[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = data[j];
data[j] = data[i];
data[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
data[low] = data[i];
data[i] = temp;
//递归调用左半数组
quickSort(data, low, j-1);
//递归调用右半数组
quickSort(data, j+1, high);
}
}
四、BinarySearch类(二分查找类):
package 适配器模式;
public class BinarySearch {
public void binarySearch(int[] list,int key) {
System.out.print(java.util.Arrays.binarySearch(list, key));//直接调用系统中的二分查找方法
}
}
五、客户端:
package 适配器模式;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
System.out.println("请输入几个数并用逗号隔开:");
Scanner sc = new Scanner(System.in);
String str = sc.next().toString();
String[] arr = str.split(",");
int[] data = new int[arr.length];
for(int j = 0; j<data.length;j++) {
data[j] = Integer.parseInt(arr[j]);
}
DataOperation operation; //定义接口对象
BinarySearch binarysearch=new BinarySearch();
QuickSort quickSort = new QuickSort();
operation=new OperationAdapter(quickSort,binarysearch); // 实例化接口对象向上转型
System.out.println("排序前的数组:");
for(int i=0;i<data.length;i++) {
System.out.print(data[i]+" ");
}
System.out.println("\n\n排序后的数组");
operation.sort(data,0,data.length-1);//调用排序
for(int j=0;j<data.length;j++){
System.out.print(data[j]+" ");
}
System.out.println();
System.out.println("请输入数据以查询相对应的索引:");
Scanner scanner = new Scanner(System.in);
int num =scanner.nextInt();//整数类型的输入方式
System.out.println("您输入的数字的索引为:");
operation.search(data,num);//查找数据所在的下标
}
}
六、运行结果: