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 接口




阅读更多

没有更多推荐了,返回首页