C&C当中的策略(strategy)模式
设计模式的就是把简答的问题复杂化,原因是为了扩展。产生多态,抽象,复杂化。
本文word格式下载:
http://wenku.baidu.com/view/40ef9919cc7931b765ce159b.html?st=1
C&C就是指Comparable和Comparator接口。
1.Comparable接口
为了比较两个对象的大小,为了能对对象进行排序。在java当中定义了comparable接口:
注意comparable是在java.lang当中。
package com.bjsxt.dp.strategy;
publicinterface Comparable {
//和某个目标(对象)进行比较,注意返回值是int类型,
//如果返回值是>0的,就是大于。
//如果返回值是小于<0的,就是小于。
//如果返回值是=0的,就是等于。
publicint compareTo(Object o);
}
Cat类:
//在cat这个类当中,具体的比较方法的实现
publicint compareTo(Cat o) {
if (oinstanceof Cat){
Cat c = (Cat) o;
if(this.getHeight() > c.getHeight())
return 1;
elseif (this.getHeight() < c.getHeight())
return -1;
elsereturn 0;
}
//如果传过来的对象不是cat的instance,应该抛出异常
else
return -100;
}
DataSort类:
在DataSort当中进行排序的算法:
//对object进行排序的算法
publicstaticvoid sort(Object[] a) {
for(int i=a.length; i>0; i--) {
for(int j=0; j<i-1; j++) {
Comparableo1 = (Comparable)a[j];
Comparableo2 = (Comparable)a[j+1];
if(o1.compareTo(o2) == 1) {
swap(a, j , j+1);
}
}
}
}
//对object进行交换的算法
privatestaticvoid swap(Object[] a,int x,int y) {
Object temp = a[x];
a[x] = a[y];
a[y] = temp;
}
Dog类:
package com.bjsxt.dp.strategy;
publicclass Dogimplements Comparable {
public Dog(int food) {
super();
this.food = food;
}
privateintfood;
publicint getFood() {
returnfood;
}
publicvoid setFood(int food) {
this.food = food;
}
//@Override
//对dog进行排序,具体的实现在dog类当中,datasort方法不用改。
publicint compareTo(Object o) {
Dog d = (Dog)o;
if(this.food > d.getFood()) return 1;
elseif(this.food < d.getFood()) return -1;
elsereturn 0;
}
@Override
public String toString() {
returnthis.food +"";
}
}
要注意的是,目前为止,我们都只能采用一种逻辑对数据排序。比如对Cat只能对height,对Dog只能对food。
2. Comparator接口
package com.bjsxt.dp.strategy;
//大小比较器,也就是说是比较策略
publicinterface Comparator {
//比较两个对象的大小
//o1>o2返回正数
//o1<o2返回负数
//o1=o2返回0
int compare(Object o1, Object o2);
}
package com.bjsxt.dp.strategy;
publicclass Catimplements java.lang.Comparable<Cat> {
privateintheight;
//private Comparator comparator = newCatHeightComparator();
//定义了一个成员变量comparator,根据不同的设定来对应不同的比较策略。如果想修改比较策略,只需要修改这个comparator去指向不同的子类对象。
private java.util.Comparator<Cat>comparator =new CatHeightComparator();
private Comparatorcomparator1 =new CatWeightComparator();
public java.util.Comparator getComparator() {
returncomparator;
}
publicvoid setComparator(java.util.Comparator comparator) {
this.comparator = comparator;
}
//这里的comparator实现的是HeightComparator。
publicint compareTo(Cat o) {
returncomparator.compare(this, o);
}
publicint getHeight() {
returnheight;
}
publicvoid setHeight(int height) {
this.height = height;
}
public Cat(int height,int weight) {
super();
this.height = height;
this.weight = weight;
}
publicint getWeight() {
returnweight;
}
publicvoid setWeight(int weight) {
this.weight = weight;
}
privateintweight;
@Override
public String toString() {
returnheight +"|" +weight;
}
}
思想:
1. 两个接口都是必要的。comparable接口是为了能对象比较大小,也就是说在DataSort当中,有个假设,就是要比较的对象都是实现了comparable接口的。
2. comparator接口是为了能实现多个比较的逻辑,从而使用不同的比较策略。所以严格来说,在使用了comparator接口,才是真的比较策略。
3. 个人感觉,所谓的策略模式,就是定义多个不同的策略,都去实现comparator接口,成为不同的策略选择器。在具体的使用的时候,使用者可以灵活选择不同的策略。
4. 那么也就是说,预先写好不同的多个策略,根据具体的情况来选择使用哪个?注意,这里是面向对象的思维,采取策略模式。事实上,如果我们用传统的面向过程的思维,这里就是一个switch语句。多个不同的策略已经写好,并放在那边,通过switch选择使用哪个或者哪几个策略。