java設計模式 -------- 行爲模式 之 策略模式(2)

[本文是自己學習所做筆記,歡迎轉載,但請註明出處:http://blog.csdn.net/jesson20121020]

  繼續上節內容,還是以對各種類型的數組進行排序爲例,這時,我們考慮複雜一點,如果,我們不再按照Cat的身高進行排序,我們想以Cat的年齡作爲排序的依據,再如,我們不再按Dog的food進行排序,而是以Dog的體重作爲依據進行排序,該怎麼辦呢,當然了,我們可以改動Cat類,Dog類,讓其實現這些功能,但是,當類很多時,要改動每一個類,也是很麻煩的,也就是現在的這種結構不好實現。所以,我們希望我們能靈活的指定比較依據,所以,很容易想到,這要用到多態,我們可以定義一個比較器接口Comparator,然後,根據需要我們可以自定義每種類型的各種比較器如CatHeightComparator和CatWeightComparator都實現公共的比較器接口,最後,我們只需改動Cat類的compareTo()方法就行,具體實現如下:

Comparator.java

/**
 * 比較器
 * @author jesson
 *
 */
public interface Comparator {
	int compore(Object o1,Object o2);
}
CatHeightComparator.java

/**
 * Cat類型高度比較器
 * 
 * @author jesson
 * 
 */
public class CatHeightComparator implements Comparator {

	@Override
	public int compore(Object o1, Object o2) {
		// TODO Auto-generated method stub
		Cat c1 = (Cat) o1;
		Cat c2 = (Cat) o2;
		if (c1.getHeight() > c2.getHeight())
			return 1;
		else if (c1.getHeight() < c2.getHeight())
			return -1;
		else
			return 0;
	}

}
CatWeightComparator.java

/**
 * Cat類型重量比較器
 * @author jesson
 *
 */
public class CatWeightComparator implements Comparator {

	@Override
	public int compore(Object o1, Object o2) {
		// TODO Auto-generated method stub
		Cat c1 = (Cat) o1;
		Cat c2 = (Cat) o2;
		if (c1.getWeight() > c2.getWeight())
			return -1;
		else if (c1.getWeight() < c2.getWeight())
			return 1;
		else
			return 0;
	}

}
Comparable.java

/**
 * 可比較接口
 * 定義了一個比較方法
 * @author jesson
 *
 */
public interface Comparable {
	public int compareTo(Object o);
}

Cat.java

/**
 * Cat類 有屬性身高,體重及toString()方法
 * 
 * @author jesson
 * 
 */
public class Cat implements Comparable {
	private int height; // 身高
	private int weight; // 體重

	//private Comparator comparator = new CatHeightComparator(); // 高度比較器
	private Comparator 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(Object o) {
		return comparator.compore(this, o);
	}
}
DataSorter.java

/**
 * 排序類
 * 
 * @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);
		DataSorter.print(a);
	}
}
   通過高度比較器和重量比較器,我們就可以靈活的選擇比較的依據,這時,如果,需求再有變化,按照Cat的年齡進行排序時,只需要新建一個年齡比較器,然後爲Cat類的Comparator的set方法或者Cat的構造方法傳入新建的年齡比較器,這樣不需再改動其他代碼,就可以實現Cat類型的數組按新定義的年齡進行排序,最大限度地重用了代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章