java設計模式,java設計模式pdf
[本文是自己學習所做筆記,歡迎轉載,但請註明出處:http://blog.csdn.net/jesson20121020]
我們實現一個排序類,使其可以實現對數組中元素進行排序,以及列印數組的功能。如下所示,可以這樣設計:
DataSorter.java
/** * 排序類 * * @author jesson * */public class DataSorter {/** * 冒泡排序方法 * * @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 * 數組 * @param x * 數組下標1 * @param y * 數組下標2 */private static void swap(int[] a, int x, int y) {// TODO Auto-generated method stubint temp = a[x];a[x] = a[y];a[y] = temp;}/** * 列印數組 * * @param a */public static void print(int[] a) {for (int i = 0; i < a.length; i++)System.out.print(a[i] + " ");System.out.println();}}</span>Test.java
/** * 測試類別 * @author jesson * */public class Test {public static void main(String[] args) {int[] a = new int[]{9,8,2,4,5,6,7};DataSorter.print(a);DataSorter.bubbleSort(a);DataSorter.print(a);}}</span>
通過這個DataSorter可以實現將數組進行冒泡排序,以及輸出數組的功能。
但是現在,需求變了,我們不僅要實現對整數數組進行排序,還要對float型和double型數組進行排序,當然了,想必大家也想到了,這可以重載排序方法,以實現不同類型的數組進行排序,是,這是一種方法。但是,現在需求又變了,不僅要實現對這些常規類型的數組進行排序,還要對其他自訂的一些類進行排序,如,我們要對Cat進行排序,並輸出,這是怎麼做呢??想必大家很容易想到用重載,如下,可以這樣寫:
Cat.java
/** * Cat類 有屬性身高,體重及toString()方法 * * @author jesson * */public class Cat {private int height; // 身高private int weight; // 體重public Cat(int height, int weight) {// TODO Auto-generated constructor stubthis.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()方法 */@Overridepublic String toString() {return this.getHeight() + "|" + this.getWeight();}}</span>DataSorter.java
/** * 排序類 * * @author jesson * */public class DataSorter {/** * 冒泡排序方法 * * @param Cat類型數組 */public static void bubbleSort(Cat[] a) {for (int i = a.length - 1; i >= 1; i--) {for (int j = 0; j < i; j++) {if (a[j].getHeight() > a[j + 1].getHeight()) {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 * 數組 * @param x * 數組下標1 * @param y * 數組下標2 */private static void swap(Cat[] a, int x, int y) {// TODO Auto-generated method stubCat 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 stubint temp = a[x];a[x] = a[y];a[y] = temp;}/** * 列印數組 * * @param a * Cat類型數組 */public static void print(Cat[] 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(3,3),new Cat(1,1)};DataSorter.print(a);DataSorter.bubbleSort(a);DataSorter.print(a);}} 這樣,不僅可以對int類型的數組進行冒泡排序,還可以對Cat類型的數組進行排序。
現在問題又來了,需求變化,要實現對Dog類型的數組進行排序,該怎麼辦呢,當然了,還是可以用上面重載的方法,但是太麻煩了,如果以後又要對其他類型的數組進行排序,豈不是又要重載排序方法,所以,這種方法不可取。那麼,如何用一個統一的排序方法,對所有類型的數組都能進行排序呢?答案是肯定的。
為了實現對所有的類都能進行排序,所以需要定義比較的規則,所以要比較的類首先是可以進行比較的,也就是這些待比較的所有類都有一個共同的特徵,即可比較,因此,我們定義一個Comparable介面,讓需要排序的類都實現這個介面,這樣,我們再將DataSorter類中的排序方法中對Cat類進行排序的代碼進行修改,類型定義為Object,這樣,所有的類都可進行排序了,具體如下:
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; // 體重public Cat(int height, int weight) {// TODO Auto-generated constructor stubthis.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()方法 */@Overridepublic String toString() {return this.getHeight() + "|" + this.getWeight();}/** * 實現Comparable介面的compareTO方法 返回1:當前的比參數中的對象大 返回-1:當前的比參數中的對象小 返回0: * 當前的和參數中的對象相等 */@Overridepublic int compareTo(Object o) {// TODO Auto-generated method stubCat cat = (Cat) o;if (this.height > cat.getHeight())return 1;else if (this.height < cat.getHeight())return -1;elsereturn 0;}}Dog.java
public class Dog implements Comparable {private int food;public Dog(int food) {super();// TODO Auto-generated constructor stubthis.food = food;}public int getFood() {return food;}public void setFood(int food) {this.food = food;}@Overridepublic int compareTo(Object o) {// TODO Auto-generated method stubDog dog = (Dog) o;if (this.food > dog.getFood())return 1;else if (this.food < dog.getFood())return -1;elsereturn 0;}@Overridepublic String toString(){return this.food + "";}}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 stubObject 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 stubint 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(3,3),new Cat(1,1)};Dog[] a = {new Dog(3),new Dog(2),new Dog(6)};DataSorter.print(a);DataSorter.bubbleSort(a);DataSorter.print(a);}} 這樣修改之後,DataSorter不僅可以對Cat類型的數組進行排序,也可以對Dog類型的數組進行排序,而且,這時,如果需要對新定義的類也能進行排序的話,只要讓其實現Comparable介面,並具體實現compareTo()方法,就可以不用再改動DataSorter類,就可以直接用DataSorter對新定義的類型的數組進行排序,達到了代碼重用的目的。