从名字可以看出来就是选择不同的策略,在这里我们使用jdk模仿实现jdk中comparable和comparator来实现依据不同的策略来进行比较
这里演示了我们当需要对猫排序时,为了让猫与猫之间可以比较,首先我们在猫中定义了一个比较compareTo方法,因为对于很多其他类都会涉及到比较操作,因此这里讲这个方法抽象到一个借口中Comparable,但是对于具体的比较,我们可以直接写在comparedTo方法中,但是这样就写死了,为了更加方便调用不同的比较方法,我们将二个对象的比较抽象为以一个compatator借口,并提供一个比较方法,因此,下面我们当使用猫的体重和年龄来比较时只需要实现就可以了,然后在comparedto方法中依据不同的比较策略来调用不同额比较器
实现代码如下:
package com.zcj.strategypattern;
public class Cat implements Comparable {
private int age;
private int weight;
public Cat(int age, int weight) {
super();
this.age = age;
this.weight = weight;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
@Override
public int comparedTo(Object o) {
// TODO Auto-generated method stub
return new CatWeightCompatator().compare(this, o);
}
@Override
public String toString() {
return "Cat [age=" + age + ", weight=" + weight + "]";
}
}
package com.zcj.strategypattern;
public interface Comparable {
public int comparedTo(Object o);
}
package com.zcj.strategypattern;
public interface Comparator {
public int compare(Object a,Object b);
}
package com.zcj.strategypattern;
public class CatAgeComparator implements Comparator {
@Override
public int compare(Object a, Object b) {
Cat cat1=(Cat) a;
Cat cat2=(Cat) b;
if(cat1.getAge()>cat2.getAge()) return 1;
else if(cat1.getAge()<cat2.getAge()) return -1;
else return 0;
}
}
package com.zcj.strategypattern;
public class CatWeightCompatator implements Comparator {
@Override
public int compare(Object a, Object b) {
Cat cat1=(Cat) a;
Cat cat2=(Cat) b;
if(cat1.getWeight()>cat2.getWeight()) return 1;
else if(cat1.getWeight()<cat2.getWeight()) return -1;
else return 0;
}
}
然后提供一个数组的排序工具类如下:
package com.zcj.strategypattern;
public class ArraySort {
public static void sort(Comparable[] arr){
for(int i=arr.length-1;i>0;i--){
for(int j=0;j<i;j++){
if(arr[j].comparedTo(arr[j+1])>0){
swap(arr,j,j+1);
}
}
}
}
private static void swap(Comparable[] arr, int j, int i) {
Comparable object = arr[j];
arr[j]=arr[j+1];
arr[j+1]=object;
}
public static void print(Comparable[] arr){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
最后是我们的测试代码:
package com.zcj.strategypattern;
public class strategyTest {
public static void main(String[] args) {
Cat[] cats =new Cat[]{new Cat(1, 5),new Cat(3, 3),new Cat(2, 4),new Cat(4, 2)};
ArraySort.sort(cats);
ArraySort.print(cats);
}
}