`

JAVA设计模式---策略模式

阅读更多

对Object数组中的Person对象,按某属性进行排序。具体的按某属性排序被抽象出来,形成策略。

 

Person类:

package com.flg.Strategy;

import java.util.Comparator;

/**
 * Created with IntelliJ IDEA.
 * User: fuliguo
 * Date: 12-8-12
 * Time: 下午4:02
 * 待排序类实现了Comparable接口
 * 排序条件由具体策略决定,排序策略实现了Comparator接口
 */
public class Person implements Comparable<Person>{

    private String name;//姓名
    private int age;//年龄
    private int height;//身高

    //请关注工厂模式博文,此处会换成工厂方法实现
    //private Comparator comparator = new PersonAgeComparator();//按年龄排序
    //private Comparator comparator = new PersonHeigthComparator();//按身高排序
      private Comparator comparator = new PersonNameComparator();//按姓名排序
    //请关注工厂模式博文,此处会换成工厂方法实现

    public Person(String name, int age,int height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    public Person(){}

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    @Override
    /**
     * 实现Comparable接口中的comparaTo方法
     * 具体排序条件由对应策略实现
     */
    public int compareTo(Person o) {
        return comparator.compare(this,o);//根据什么排序,由具体策略实现决定
    }
}

 

按Person的年龄进行排序的策略,PersonAgeComparator类:

package com.flg.Strategy;

import java.util.Comparator;

/**
 * Created with IntelliJ IDEA.
 * User: fuliguo
 * Date: 12-8-12
 * Time: 下午4:07
 * 按Person的年龄进行排序的策略
 */
public class PersonAgeComparator implements Comparator<Person> {


    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge()-o2.getAge();//按年龄比较
    }
}

 

按Person的身高进行排序的策略,PersonHeightComparator类:

package com.flg.Strategy;

import java.util.Comparator;

/**
 * Created with IntelliJ IDEA.
 * User: fuliguo
 * Date: 12-8-12
 * Time: 下午4:13
 * 按Person的高度进行排序的策略
 */
public class PersonHeigthComparator implements Comparator<Person> {


    @Override
    public int compare(Person o1, Person o2) {
        return o1.getHeight()-o2.getHeight();//按高度比较
    }
}

 

按Person的名字进行排序的策略,PersonNameComparator类:

package com.flg.Strategy;

import java.util.Comparator;

/**
 * Created with IntelliJ IDEA.
 * User: fuliguo
 * Date: 12-8-12
 * Time: 下午4:05
 * 按Person的姓名进行排序的策略
 */
public class PersonNameComparator implements Comparator<Person> {

    @Override
    public int compare(Person o1, Person o2) {
        return o1.getName().compareToIgnoreCase(o2.getName());//按姓名排序
    }
}

 

测试类 Test类:

package com.flg.Strategy;

import com.flg.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: fuliguo
 * Date: 12-8-12
 * Time: 下午5:07
 * 测试类
 */
public class Test {

    public Object[] getObjects() {


        Object [] objects  = new Object[]{
            new Person("张三",22,188),
            new Person("赵六",19,210),
            new Person("王五",30,175),
            new Person("李四",10,158)

        } ;

        return objects;

    }


    /**
     * 控制台输出遍历Object数组对像顺序
     * @param
     */
    public  void printObjects(Object [] objects) {
        Person p;
        for(int i=0;i<objects.length;i++){
            p = (Person) objects[i];
            System.out.println(p.getName()+"---"+p.getAge()+"---"+p.getHeight());
        }

    }
    public static void  main(String [] arg){
          Test t = new Test();
          Object [] objects = t.getObjects();
          t.printObjects(objects);
          Arrays.sort(objects);
          System.out.println("******排序后******");
          t.printObjects(objects);

    }


}
 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics