首页 > 代码库 > 一起学java设计模式--适配器模式(结构型模式)

一起学java设计模式--适配器模式(结构型模式)

适配器模式

现有一个接口DataOperation定义了排序方法sort(int[]) 查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch(int[], int)方法实现了二分查找算法。现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中。绘制类图并编程实现。 (要求实现快速排序和二分查找)

编码实现:

interface DataOperation{
	void sort(int[] list);
	int search(int[] list, int number);
}

class QuickSort{
	public int[] quickSort(int[] num){
		return sort(num,0,num.length-1);
	} 
	private int[] sort(int[] num,int left,int right){
		if(left < right){
			//将第一个数作为参照轴
			int s = num[left];
			int i = left;
			int j = right+1;
			while(true){
				//从左向右找,直到找到比S大的数
				while(i+1<num.length && num[++i]<s);
				//从右向左找,直到找到比S小的数
				while(j-1>-1 && num[--j]>s);
				//此时如果i>=j,则说明已交叉,跳出该永久循环
				if(i >= j){
					break;
				}
				//否则如果i<=j,则交换下标为i和下标为j的两元素的值
				swap(num,i,j);
			}
			//把比S小的数放到下标为left处
			num[left] = num[j];
			//最后将轴S置于比它小和比它大的两组数之间
			num[j] = s;
			//对S的左右两侧分别再次使用快速排序
			sort(num,left,j-1);
			sort(num,j+1,right);
		}
		return num;
	}

	private void swap(int[] num,int i,int j){
		int t;
		t = num[i];
		num[i] = num[j];
		num[j] = t;
	} 
}

class BinarySearch{
	public int binarySearch(int[] num,int x){
		int low = 0;
		int high = num.length - 1; 
		while(low <= high){ 
			//此时抛出ArrayIndexOutOfBoundsException 异常..
			int mid = low + (high - low)/2;  
			int midVal = num[mid];
			if(x > midVal){
				low = mid + 1;
			}else if (x < midVal){
				high = mid - 1;
			}else{
				return mid; 
			}
		}
		return -1; //没找到元素x
	}
}

class DataOperationAdpter implements DataOperations{
	QuickSort quickSort=new QuickSort();
	BinarySearch binarySearch =new BinarySearch();
	@Override
	public int search(int[] list, int number) {
		return binarySearch.binarySearch(list, number);
	}

	@Override
	public void sort(int[] list) {
		quickSort.quickSort(list); 
	}
	
}

class DataOperationClient{
	public static void main(String a[])
	{
  //适配器 DataOperationAdapter
		DataOperation dataAdpter = new DataOperationAdpter();				int[] list={1,3,56,23,54,86,43,57,88,56,82,90};
		System.out.println("排序前的数据: ");
		for(int i=0;i<list.length;i++){
			System.out.print(list[i]+"    ");
		} 
		dataAdpter.sort(list);
		System.out.println("\n排序后的数据: ");
		for(int i=0;i<list.length;i++){
			System.out.print(list[i]+"    ");
		}
		int number = 56;
		int index = dataAdpter.search(list, number);	
		System.out.println("\n要查找的数据: "+number+ ", 所在下标:"+index);
}

运行结果: