结构型模式之对象适配器模式(算法适配)

本文通过实例介绍了如何使用对象适配器模式将QuickSort和BinarySearch的算法适配到DataOperation接口,无需修改原有源代码,详细阐述了适配器的设计和实现过程。
部署运行你感兴趣的模型镜像

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

类图


代码

package 适配器模式实例之算法适配;

public interface DataOperation {		//目标类
	public void sort(int sort[], int i, int j);
	public int search(int search[], int n);
}
package 适配器模式实例之算法适配;

public class AlgotithmAdapter implements DataOperation{		//适配器类
	private QuickSort quick;
	private BinarySearch binary;
	
	public AlgotithmAdapter(QuickSort quick) {
		this.quick = quick;
	}
	
	public AlgotithmAdapter(BinarySearch binary) {
		this.binary = binary;
	}
	
	public void sort(int sort[], int i, int j) {
		quick.quickSort(sort, i, j);
	}

	public int search(int search[], int n) {
		return binary.binarySearch(search, n);
	}
}
package 适配器模式实例之算法适配;

public class QuickSort {		//适配者类
	//划分数组
	int partion(int array[], int p, int r) {
		int x = array[r];
		int i = p - 1;//注意这点,把i设成负值,然后作为移动的标志
		int j;
			for (j = p; j < r; j++) {
				if (array[j] <= x) {
					i++;
					int temp = array[j];
					array[j] = array[i];
					array[i] = temp;
				}
			}
		int temp = array[j];
		array[j] = array[i + 1];
		array[i + 1] = temp;
		return i+1;//返回的应该是交换后的哨兵的位置
	}
	//递归解决每个划分后的小数组
	void quickSort(int[] array, int p, int r) {
		if (p < r) {
			int q = partion(array, p, r);
			quickSort(array, p, q - 1);
			quickSort(array, q + 1, r);
		}
	}
}
package 适配器模式实例之算法适配;

public class BinarySearch { 		//适配者类
   public int binarySearch(int[] srcArray, int des){   
      
        int low = 0;   
        int high = srcArray.length-1;   
        while(low <= high) {   
            int middle = (low + high)/2;   
            if(des == srcArray[middle]) {   
                return middle;   
            }else if(des <srcArray[middle]) {   
                high = middle - 1;   
            }else {   
                low = middle + 1;   
            }  
        }  
        return -1;  
   }  
}  
package 适配器模式实例之算法适配;

public class Client {		//客户端类
	public static void main(String[] args) {
		int[] array = { 4, 3, 5, 2, 3, 6, 8, 9, 18, 12, 53, 20};
		int i;
		System.out.print("排序前:");
		for (i=0; i<array.length; i++)
			System.out.print(array[i]+" ");
		BinarySearch binary = new BinarySearch();
		AlgotithmAdapter algotithm1 = new AlgotithmAdapter(binary);
        System.out.println("\n通过二分查找得到数字5:位于数组的第"+(algotithm1.search(array, 5)+1)+"位");  
		QuickSort sort = new QuickSort();
		AlgotithmAdapter algotithm2 = new AlgotithmAdapter(sort);
		algotithm2.sort(array, 0, array.length - 1);
		
		System.out.println("------------------------------");
		System.out.print("排序后:");
		for (i=0; i<array.length; i++)
			System.out.print(array[i]+" ");
		//int[] src = new int[] {1, 3, 5, 7, 8, 9};   
        System.out.println("\n通过二分查找得到数字5:位于数组的第"+(algotithm1.search(array, 5)+1)+"位");  
	}
}
运行效果图


您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值