public class Strategy {
public static void main(String[] args) {
int[] arr = {5, 3, 1, 7, 2};
new DataSorter().sort(arr);//調用工具類進行排序
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
}
}
class DataSorter{//用於排序的工具類
public void sort(int[] arr){//調用sort方法進行排序, 此處使用冒泡排序
for(int i = arr.length - 1; i > 0; i--){
for(int j = 0; j < i; j++){
if(arr[j] > arr[j + 1])
swap(arr, j, j + 1);
}
}
}
private void swap(int[] arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
複製代碼
float
類型, 把int類型數組的排序算法複製一遍不就能夠了嗎?class Cat{
private int age;//貓的年齡
private int weight;//貓的體重
//get / set 方法...
}
複製代碼
public void sort(Cat[] arr){//以貓數組做爲參數
for(int i = arr.length - 1; i > 0; i--){
for(int j = 0; j < i; j++){
if(arr[j].getAge() > arr[j + 1].getAge())//根據貓的年齡做比較
swap(arr, j, j + 1);
}
}
}
複製代碼
sort()
方法能夠對任何調用它的對象進行排序.sort()
方法的參數改成Object
類型不久能夠了嘛. 這個方向是對的, 可是問題是, 當拿到兩個Object
類型對象, 應該根據什麼規則進行比較呢?比較法則
, 這樣在排序的時候就能直接調用對象的排序法則進行排序了.Comparable
接口, 凡是要進行比較的類都要實現Comparable
接口, 而且定義本身的比較法則, 也就是CompareTo()
方法.Comparable
接口的對象進行比較, 不用擔憂比較的細節了.public class Strategy {
public class Strategy {
public static void main(String[] args) {
// Integer[] arr = {5, 3, 1, 7, 2};//注意這裏把int改成Integer, Integer是Object的子類
Cat[] arr = {new Cat(3, 3), new Cat(1, 1), new Cat(5, 5)};
DataSorter ds = new DataSorter();
ds.sort(arr);
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
}
}
}
class DataSorter{//用於排序的工具類
public void sort(Object[] arr){//參數類型爲Object
for(int i = arr.length - 1; i > 0; i--){
for(int j = 0; j < i; j++){
Comparable c1 = (Comparable) arr[j];//先轉爲Comparable類型
Comparable c2 = (Comparable) arr[j + 1];
if(c1.CompareTo(c2) == 1)//調用CompareTo()進行比較, 不關心具體的實現
swap(arr, j, j + 1);
}
}
}
private void swap(Object[] arr, int i, int j){
Object temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
class Cat implements Comparable{
private int age;
private int weight;
@Override
public int CompareTo(Object o) {
if(o instanceof Cat){//先判斷傳入的是不是Cat類對象, 不是則拋異常
Cat c = (Cat) o;
if(this.age > c.age) return 1;
else if (this.age < c.age) return -1;
else return 0;
}
throw null == o ? new NullPointerException() : new ClassCastException();
}
// get / set ...
//toString() ...
}
interface Comparable{
public int CompareTo(Object o);
}
複製代碼
Comparable
接口來由, 你們會感受整個設計又美好了一些, 可是其中還有漏洞. 咱們在Cat
類的CompareTo()
方法中, 對貓的比較策略是寫死的, 如今咱們按貓的年齡比較大小, 若是哪天咱們想按照貓的體重比較大小, 又要去修改源碼了. 有沒有擴展性更好的設計?Comparable
接口, 可是它具體是怎麼比較的, 則經過具體的Comparator
比較器進行比較.Comparator
, 用戶的比較器須要實現Comparator
接口, 下面上代碼:public class Strategy {
public static void main(String[] args) {
Cat[] arr = {new Cat(3, 3), new Cat(1, 1), new Cat(5, 5)};
DataSorter ds = new DataSorter();
ds.sort(arr);
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
}
}
class DataSorter{//用於排序的工具類
public void sort(Object[] arr){//參數類型爲Object
for(int i = arr.length - 1; i > 0; i--){
for(int j = 0; j < i; j++){
Comparable c1 = (Comparable) arr[j];//先轉爲Comparable類型
Comparable c2 = (Comparable) arr[j + 1];
if(c1.CompareTo(c2) == 1)//背後已經轉換爲使用Comparator的定義的規則進行比較
swap(arr, j, j + 1);
}
}
}
private void swap(Object[] arr, int i, int j){
Object temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
class Cat implements Comparable{
private int age;
private int weight;
private Comparator comparator = new CatAgeComparator();//默認持有年齡比較器
@Override
public int CompareTo(Object o) {
return comparator.Compare(this, o);//調用比較器比較而不是直接在此寫比較法則
}
// get / set / toString ...
}
interface Comparable{
public int CompareTo(Object o);
}
interface Comparator{
public int Compare(Object o1, Object o2);
}
//用戶本身定義的, 按照貓的年齡比較大小的比較器
class CatAgeComparator implements Comparator{
@Override
public int Compare(Object o1, Object o2) {
Cat c1 = (Cat) o1;
Cat c2 = (Cat) o2;
if(c1.getAge() > c2.getAge()) return 1;
else if(c1.getAge() < c2.getAge()) return -1;
else return 0;
}
}
//按照貓的體重比較大小的比較器
class CatWeightComparator implements Comparator{
@Override
public int Compare(Object o1, Object o2) {
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
接口和Comparator
接口, 其實這兩個接口都是Java自帶的, 經過上面的代碼示例, 想必你們也應該知道了爲何會有這兩個接口.Comparable
定義的就是一種比較的策略, 這裏的策略你能夠理解爲一個功能, 然而策略有了, 咱們還須要有具體的策略實現, 因而便有了Comparator
接口.
public interface Fire {
public void fire();//發射炮彈的策略
}
複製代碼
public interface FireAction {
public void fireAction(Tank tank);
}
複製代碼
Fire()
接口, 並且坦克擁有發射炮彈的動做, 至於動做的具體實現, 這裏默認給出只發射一顆炮彈的動做.public class Tank implements TankHitListener, Fire {
//省略各類屬性方法...
private FireAction fireAction = new NormalFireAction();//默認動做是隻發射一顆炮彈
@Override
public void fire() {
fireAction.fireAction(this);
}
//...
複製代碼
fire()
接口, 得到發射炮彈的能力.