java设计模式 -------- 行为模式 之 策略模式(3)

时间:2022-04-12 22:02:11

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020]

  继续上节内容,到目前为至,其实已经很好的实现了对各种类型的数组进行排序,而且,扩展性也不错,我们定义的比较器接口,可以适应不同的比较策略,但是我们注意到一点,在实现compare()方法时,我们需要向下转型,将Object类型转换成具体的类型,还是觉得有点麻烦,有没有一种方法,使得我们在实现Comparator接口时就规定了具体要比较的类型呢?这时,我们很容易想到JDK中的<T> 泛型就能实现这种功能。所以,我们就将<T> 泛型应用在我们的比较器中,我们应用JDK中Comparator和Comparable到我们的程序,如下:

Cat.java

import java.util.Comparator;
/**
* Cat类 有属性身高,体重及toString()方法
*
* @author jesson
*
*/
public class Cat implements java.lang.Comparable<Cat> {
private int height; // 身高
private int weight; // 体重

//private Comparator comparator = new CatHeightComparator(); // 高度比较器
private Comparator<Cat> comparator = new CatWeightComparator(); // 重量比较器

public Comparator getComparator() {
return comparator;
}

public void setComparator(Comparator comparator) {
this.comparator = comparator;
}

public Cat(int height, int weight) {
// TODO Auto-generated constructor stub
this.height = height;
this.weight = weight;
}

public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}

public int getWeight() {
return weight;
}

public void setWeight(int weight) {
this.weight = weight;
}

/**
* 重写toString()方法
*/
@Override
public String toString() {
return this.getHeight() + "|" + this.getWeight();
}

/**
* 实现Comparable接口的compareTO方法
* 调用具体的比较器进行比较大小
*/
@Override
public int compareTo(Cat o) {
return comparator.compare(this, o);
}
}
CatHeightComparator.java

import java.util.Comparator;

/**
* Cat类型高度比较器
*
* @author jesson
*
*/
public class CatHeightComparator implements Comparator<Cat> {

@Override
public int compare(Cat o1, Cat o2) {
// TODO Auto-generated method stub
if (o1.getHeight() > o2.getHeight())
return 1;
else if (o1.getHeight() < o2.getHeight())
return -1;
else
return 0;
}
}
CatWeightComparator.java

import java.util.Comparator;

/**
* Cat类型重量比较器
*
* @author jesson
*
*/
public class CatWeightComparator implements Comparator<Cat> {

@Override
public int compare(Cat o1, Cat o2) {
// TODO Auto-generated method stub
if (o1.getWeight() > o2.getWeight())
return -1;
else if (o1.getWeight() < o2.getWeight())
return 1;
else
return 0;
}
}
DataSorter
import java.lang.Comparable;/** * 排序类 *  * @author jesson *  */public class DataSorter {	/**	 * 冒泡排序方法	 * 	 * @param Cat类型数组	 */	public static void bubbleSort(Object[] a) {		for (int i = a.length - 1; i >= 1; i--) {			for (int j = 0; j < i; j++) {				Comparable o1 = (Comparable) a[j];				Comparable o2 = (Comparable) a[j + 1];				if (o1.compareTo(o2) == 1) {					swap(a, j, j + 1);				}			}		}	}	/**	 * 冒泡排序方法	 * 	 * @param a	 *            整数数组	 */	public static void bubbleSort(int[] a) {		for (int i = a.length - 1; i >= 1; i--) {			for (int j = 0; j < i; j++) {				if (a[j] > a[j + 1]) {					swap(a, j, j + 1);				}			}		}	}	/**	 * 交换两个数据	 * 	 * @param a	 *            Object类型数组	 * @param x	 *            数组下标1	 * @param y	 *            数组下标2	 */	private static void swap(Object[] a, int x, int y) {		// TODO Auto-generated method stub		Object temp = a[x];		a[x] = a[y];		a[y] = temp;	}	/**	 * 交换两个数据	 * 	 * @param a	 *            数组	 * @param x	 *            数组下标1	 * @param y	 *            数组下标2	 */	private static void swap(int[] a, int x, int y) {		// TODO Auto-generated method stub		int temp = a[x];		a[x] = a[y];		a[y] = temp;	}	/**	 * 打印数组	 * 	 * @param a	 *            Object类型数组	 */	public static void print(Object[] a) {		for (int i = 0; i < a.length; i++)			System.out.print(a[i] + " ");		System.out.println();	}	/**	 * 打印数组	 * 	 * @param a	 *            int类型数组	 */	public static void print(int[] a) {		for (int i = 0; i < a.length; i++)			System.out.print(a[i] + " ");		System.out.println();	}}
Test.java

/**
* 测试类
* @author jesson
*
*/
public class Test {
public static void main(String[] args) {
//int[] a = new int[]{9,8,2,4,5,6,7};
Cat[] a = {new Cat(5,5),new Cat(1,1),new Cat(3,3)};
//Dog[] a = {new Dog(3),new Dog(2),new Dog(6)};
DataSorter.print(a);
//DataSorter.bubbleSort(a);
java.util.Arrays.sort(a);
DataSorter.print(a);
}
}
   可以看出,我们这里没有用自己定义的Comparable和Comparator,而是用JDK中的Comparable<T>和Comparator<T>接口,其实JDK已经封装好了sort()方法,我们直接拿来用,但是有个前提,需要被排序的类要实现JDK的Comparable接口;所以在测试程序里,我们可以直接用JDK中的sort(Object[] o)方法对我们定义的类型的数组进行排序。

   以上,我们所写的Comparable和Comparator接口只是用来模拟JDK中的对应接口,在实际的开发过程中,我们一般直接拿来用即可。