设计模式之3 C&C当中的策略(strategy)模式

C&C当中的策略(strategy)模式

设计模式的就是把简答的问题复杂化,原因是为了扩展。产生多态,抽象,复杂化。

 

本文word格式下载:

http://wenku.baidu.com/view/40ef9919cc7931b765ce159b.html?st=1


C&C就是指ComparableComparator接口。

 

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;

       }

       //如果传过来的对象不是catinstance,应该抛出异常

       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选择使用哪个或者哪几个策略。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章