Strategy策略模式

来源:互联网 发布:项目管理平台软件 编辑:程序博客网 时间:2024/06/06 03:40
JDK中使用该模式的API:Comaprable接口

接口:Comparable
抽象方法:CompareTo(T obj);//1--->大于obj  0----->等于obj  -1---->小于obj

使用:
任何一个对象想要排序或比较大小,需要先实例化Comparable接口。
然后重写CompareTo方法,定义对象比较大小的规则(如根据某个属性值比较大小)

局限性:
在CompareTo方法中,对象比较大小的规则是写死的,没办法更改多种比较条件。
  1. @Override
  2. public int compareTo(T obj){
  3. //这里写死类obj和this的比较规则,不灵活
  4. //只能根据obj的age属性来比较大小
  5. if(obj.age > this.age)
  6. return -1;
  7. else if(obj.age == this.age){
  8. return 0;
  9. }else{
  10. return 1;
  11. }
  12. }

若想要动态改变对象比较规则,需要用到JDK提供的比较器Comparator

--------------------------------------------------------------------------

接口:Comparator比较器
抽象方法:Compare(T obj1, T obj2);//1--->obj1大于obj2  0----->obj1等于obj2  -1---->obj1小于obj2

使用:
任何一个对象想要排序或比较大小,需要先实例化Comparator接口。
然后重写Compare方法,定义对象比较大小的规则(如根据某个属性值比较大小)

结合Comparable和Comparator的使用:

AgeComparator.java年龄比较器
  1. //年龄比较器
  2. public class AgeComparator implements Comparator{
  3. @Override
  4. compare(T obj1, T obj2){
  5. //这里写比较逻辑的代码
  6. if(obj1.age > obj2.age)
  7. return -1;
  8. else if(obj1.age == obj2.age){
  9. return 0;
  10. }else{
  11. return 1;
  12. }
  13. }
  14. }

HeightComparator.java身高比较器
  1. //身高比较器
  2. public class HeightComparator implements Comparator{
  3. @Override
  4. compare(T obj1, T obj2){
  5. //这里写比较逻辑的代码
  6. if(obj1.height > obj2.height )
  7. return -1;
  8. else if(obj1.height == obj2.height ){
  9. return 0;
  10. }else{
  11. return 1;
  12. }
  13. }
  14. }


XXXCompareble.java
  1. public class XXXCompareble implements Comparable{
  2. Comparator ageComparator = new AgeComparator();
  3. Comparator heightComparator = new HeightComparator();
  4.  
  5. @Override
  6. compareTo(T obj){
  7. //直接使用Comparator比较器,需要哪种比较器就用哪种比较器,灵活
  8. return ageComparator.compare(this,obj);
  9. }
  10. }

-----------------------------------------------------
策略模式的应用:
在Comparator比较器中,通过实例化Comparator接口来实现各种比较策略,如:
年龄比较策略,身高比较策略等。。。
如果没有使用策略模式,则compareTo方法被写死,不灵活。
在compareTo方法中使用Comparator的比较策略,灵活地扩展比较策略。