JAva設計モード------動作モードのポリシーモード(3)


[本文は自分で勉強したノートです.転載を歓迎しますが、出典を明記してください.http://blog.csdn.net/jesson20121020]
前節の内容を続けて、現在まで、実はすでにとても良い実現は各種のタイプの配列に対して並べ替えて、その上、拡張性も悪くなくて、私達が定義した比較器のインターフェース、異なる比較策略に適応することができて、しかし私達は1点に気づいて、compare()方法を実現する時、私達は下へ転換して、Objectのタイプを具体的なタイプに変換する必要がありますそれともちょっと面倒だと思いますが、Comparatorインタフェースを実現する際に具体的に比較するタイプを規定する方法はありませんか?このとき,JDKにおける汎用型がこの機能を実現できることを容易に考えることができる.そこで、をコンパレータに汎用的に適用し、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とComparatorインタフェースを使用しています.実はJDKはsort()メソッドをカプセル化しています.私たちは直接使用しますが、ソートされたクラスがJDKのComparableインタフェースを実現する必要がある前提があります.したがって,テストプログラムでは,JDKにおけるsort(Object[]o)法を用いて定義したタイプの配列を直接ソートすることができる.
以上、私たちが書いたComparableとComparatorインタフェースはJDKの対応インタフェースをシミュレートするために使われているだけで、実際の開発の過程で、私たちは一般的に直接持って来ればいいです.