码迷,mamicode.com
首页 > 其他好文 > 详细

策略模式

时间:2015-05-31 14:05:32      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:java   设计模式   策略模式   

策略模式定义了算法族,这些算法被分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。(此定义来源于《深入浅出设计模式》)

下面举一个根据这模式设计并实现有序数组的例子。

算法族是几个排序算法,它们都继承自Sort接口:


package sort;

public interface Sort {
	/**
	 * 这是需要变化的地方。将它独立处理,和不需要变化的部分分开。
	 * @param a
	 */
    public <T extends Comparable<T>> void sort(T[] a);
}


这里贴出这个接口的两个实现类的代码,第一个是插入排序实现类:

package sort;

public class InsertSort implements Sort {

	@Override
	public <T extends Comparable<T>> void sort(T[] a) {
		// TODO Auto-generated method stub
		int length = a.length;
		for(int i = 0; i < length; i++) {
			T key = a[i];
			// 需要与key比较的元素的位置
			int j = i - 1;
			/**
			 * j >= 0保证a[j]存在;
			 * a[j].compareTo(key) > 0保证a[j] > key, a[j]的位置需要后移,
			 * 这时(a[j]后移之后,j自减1之前),j就是key的候选位置;
			 * 如果是因为j < 0而退出while循环的,说明子数组中没有小于key的元素,
			 * 也就是说,0是key的正确位置。
			 */
			while (j >= 0 && a[j].compareTo(key) > 0) {
				// 元素后移一个位置
				a[j+1] = a[j];
				// 需要比较的元素的位置前移
				j--;
			}
			// j+1就是key的正确位置
			a[j+1] = key;
		}
		
	}

}

插入排序算法的讲解见Java实现插入排序


第二个是合并排序实现类:

package sort;

import java.lang.reflect.Array;

public class MergeSort implements Sort {

	@SuppressWarnings("unchecked")
	private <T extends Comparable<T>> void merge(T[] a, int p, int q, int r) {
		// 获得数组left的长度
		int n1 = q - p + 1;
		// 获得数组right的长度
		int n2 = r - q;
		// 创建数组left
		T[] left = (T[]) Array.newInstance(a.getClass().getComponentType(), n1);
		// 创建数组right
		T[] right = (T[]) Array.newInstance(a.getClass().getComponentType(), n2);
        // 把数组a的相应值赋给left
		for(int i = 0; i < n1; i++){
        	left[i] = a[p + i];
        }
		// 把数组a的相应值赋给right
        for(int i = 0; i < n2; i++){
        	right[i] = a[q + 1 + i];
        }
        // left数组当前待处理元素的位置
        int i = 0;
        // left结束标识
        boolean endLeft = false;
        // right数组当前待处理元素的位置
        int j = 0;
        // right结束标识
        boolean engRight = false;
        int k = p;
        while(k <= r){
        	if (left[i].compareTo(right[j]) < 0) {
				a[k] = left[i];
				// 说明left的最后一个元素已被处理
				if (i == (n1 - 1)) {
					endLeft = true;
					k++;
					break;
				}
				i++;
			} else {
				a[k] = right[j];
				// 说明right的最后一个元素已被处理
				if (j == (n2 - 1)) {
					engRight = true;
					k++;
					break;
				}
				j++;
			}
        	k++;
        }
        // 把还没处理完的数组的剩余元素放进a中
        if (endLeft) {
			while(k <= r){
				a[k] = right[j];
				k++;
				j++;
			}
		} else {
			while(k <= r){
				a[k] = left[i];
				k++;
				i++;
			}
		}
	}

	@Override
	public <T extends Comparable<T>> void sort(T[] a) {
		// TODO Auto-generated method stub
		// 默认情况下,对数组从头到尾排序
		int p = 0;
		int r = a.length - 1;
		sort(a, p, r);

	}

	private <T extends Comparable<T>> void sort(T[] a, int p, int r) {
		// TODO Auto-generated method stub
		if (p < r) {
			int q = (p + r) / 2;
			sort(a, p, q);
			sort(a, q + 1, r);
			merge(a, p, q, r);
		}

	}

	@SuppressWarnings("unchecked")
	public <T extends Comparable<T>> void test(T[] a) {
		T[] b = (T[]) Array.newInstance(a.getClass().getComponentType(),
				a.length);
		for (int i = 0; i < a.length; i++) {
			b[i] = a[i];
		}
		T min = null;
		boolean flag = true;
		for (int i = 0; i < b.length; i++) {
			if (flag) {
				min = b[i];
				flag = false;
			}
			if (b[i].compareTo(min) < 0) {
				min = b[i];
			}
		}

		System.out.println(min);

	}

	@SuppressWarnings("unchecked")
	public <T> void test2(T[] a) {
		T[] b = (T[]) new Object[a.length];
		for (int i = 0; i < a.length; i++) {
			b[i] = a[i];
		}

		for (int i = 0; i < b.length; i++) {
			System.out.println(b[i]);
		}
	}

}

合并排序算法的具体讲解见Java实现归并排序


这个算法族的客户是有序数组:

package sort;

import java.util.Arrays;

/**
 * 使用算法的客户
 * @author yuncong
 *
 * @param <T>
 */
public abstract class SortArray<T extends Comparable<T>> {
	T[] a;
	// 组合SortArray和Sort
	Sort sort;

	public T[] getA() {
		return a;
	}

	public abstract void setA(T[] a);

	@Override
	public String toString() {
		return "SortArray [a=" + Arrays.toString(a) + "]";
	}
	
}
具体有序数组类型有插入排序有序数组和合并排序有序数组:

package sort;

public class InsertSortArray<T extends Comparable<T>> extends SortArray<T> {

	public InsertSortArray() {
		this.sort = new InsertSort();
	}

	@Override
	public void setA(T[] a) {
		// TODO Auto-generated method stub
		sort.sort(a);
		this.a = a;
		
	}
}

package sort;

public class MergeSortArray<T extends Comparable<T>> extends SortArray<T> {
	public MergeSortArray() {
		// TODO Auto-generated constructor stub
		this.sort = new MergeSort();
	}

	@Override
	public void setA(T[] a) {
		// TODO Auto-generated method stub
        this.sort.sort(a);
		this.a = a;
	}

}

测试类:

package sort;

import java.util.Arrays;

public class TestSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// InsertSort
		// SortArray<Integer> sortArray = new InsertSortArray<Integer>();
		// Integer[] a = new Integer[]{14, 2, 7, 9, 10};
		// sortArray.setA(a);
		// Integer[] arrIntegers = sortArray.getA();
		// System.out.println(Arrays.toString(arrIntegers));
        
		// MergeSort
		SortArray<Integer> sortArray = new MergeSortArray<>();
		Integer[] a = new Integer[] { 14, 2, 7, 9, 10 };
		sortArray.setA(a);
		Integer[] arrIntegers = sortArray.getA();
		System.out.println(Arrays.toString(arrIntegers));

	}

}


策略模式

标签:java   设计模式   策略模式   

原文地址:http://blog.csdn.net/l294265421/article/details/46287821

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!