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 介面