1. 程式人生 > >java 設計模式 策略模式,comparable 介面,compareTo 方法

java 設計模式 策略模式,comparable 介面,compareTo 方法

重點在於判斷 物件   誰大誰小

尤其是比較類物件的 “誰大誰小”

列印類物件 print(a) 必須在類裡要重寫 toString() 方法

@Override
public String toString(){
return this.food+"";//後面那個雙引號是為了把整個轉成字串。不能直接int打印出
}

對多種型別(當然都是同種型別)來比較

比較物件的方式(標準)由各個子類自己去定義

申明一個“比較介面” 裡面有一個“方法申明”  比較大小,引數就是Object型別(這裡只傳一個引數,意思是自己和傳進來的那個物件比較大小),

//補充一下,這裡傳入的引數可以是Comparable 物件,因為所有比較物件都有實現comparable介面,所以無所謂還是用Object 型別,再強制轉換

返回值是int 型 大於0 小於0 等於0

所有的實體類都必須實現這個“比較介面”,這裡就要重寫接口裡“方法申明” 的方法

if(o instanceof Cat){ // 如果object 是一個”貓“類 的物件
Cat c=(Cat)o;  // 強制轉為貓
if(this.getHeight()>c.getHeight())return 1; // 再比較大小
else if(this.getHeight()<c.getHeight())return -1;
else return 0;
}
return -100;

寫法:

“比較介面” o1 =(“比較介面”) 參與比較的第一個傳入物件

“比較介面” o2 =(“比較介面”) 參與比較的第二個傳入物件

if(o1.接口裡“方法申明” 的方法(o2)==0)   //這裡就是參與比較了

擴充套件,因為雖然每個類裡自定義了compareTo方法,實現了comparable 介面,但是排序規則還是相對來說固定的

所以,為了能適應將來的多變的compare 比較方式

申明一個介面 “大小比較器” 比較大小,裡面有一個“方法申明”  比較大小 (這裡傳入兩個Object  型別的物件,相互比較大小)

//補充一下,這裡傳入的引數可以是Comparable 物件,因為所有比較物件都有實現comparable介面,所以無所謂還是用Object 型別,再強制轉換

申明一個比較器類,表示 按照某種標準 比較大小的 比較器 實現 上面的 “大小比較器”  介面(重點就在這裡,就是各個比較器類的比較標準不同),

重寫裡面的比較方法,把類物件比較的標準和方法寫完

把 compareTo 方法 內容 寫成

return new 比較器類().compare(this, o);

或者把 比較器類 在類裡實例化

然後 直接用 物件.compare()

寫成:

private “大小比較器”  comparator=new 比較器類();  // 每次替換就只要替換這裡的比較器類就可以了

// 也可以給comparator 加上getter 和 setter 方法 更方便

在 compareTo方法裡 寫成 return comparator.compare(this, o);

普通類物件還是要實現comparable介面 重寫 compareTo 方法

只不過 重寫CompareTo 方法的時候 交給具體的 Comparator (策略和標準)去實現

使用jdk 自帶的comparable 介面 就要指定 對應型別的泛型方式<Cat>

Comparator 也要指定 對應型別的泛型方式<Cat>

中間實現方式過程裡就不用強制型別轉換了

實際運用可以直接用  java.util.Array.sort(a); //  對陣列型別進行排序,這裡的a數組裡所有的元素必須實現comparable 介面