java中排序實現簡單的策略模式

jopen 13年前發布 | 35K 次閱讀 Java開發 Java

策略模式(Strategy Pattern)中體現了兩個非常基本的面向對象設計的原則

–封裝變化的概念
–編程中使用接口,而不是對接口的實現

策略模式的定義
–定義一組算法,將每個算法都封裝起來,并且使它們之間可以互換。
–策略模式使這些算法在客戶端調用它們的時候能夠互不影響地變化
</div>

策略模式的編寫步驟
–1.對策略對象定義一個公共接口。
–2.編寫策略類,該類實現了上面的公共接口
–3.在使用策略對象的類中保存一個對策略對
象的引用。
–4.在使用策略對象的類中,實現對策略對象
的set和get方法(注入)或者使用構造方法完

成賦值


java排序策略模式實現:

有這樣一個類:

public class Person {

private int id;

private String name;

private int age;

}

要求:假如有若干個類Person對象存在一個List當中,對他們進行排序,分別按照名字、

年齡、id 進行排序(要有正序與倒序兩種排序方式)。假如年齡或者姓名重復,按照id的正序進行排序。

以下為實現源代碼。

類Person

</b>

package com.jack.SortStrategy;

public class Person { private int id; private String name; private int age;

public Person(int id,String name,int age){
    this.id=id;
    this.age=age;
    this.name=name;
}
/**
 * @return the id
 */
public int getId() {
    return id;
}
/**
 * @param id the id to set
 */
public void setId(int id) {
    this.id = id;
}
/**
 * @return the name
 */
public String getName() {
    return name;
}
/**
 * @param name the name to set
 */
public void setName(String name) {
    this.name = name;
}
/**
 * @return the age
 */
public int getAge() {
    return age;
}
/**
 * @param age the age to set
 */
public void setAge(int age) {
    this.age = age;
}

}</b></pre>

類IdOrder

package com.jack.SortStrategy;

import java.util.Comparator;

public class IdOrder implements Comparator<Person> {

@Override
public int compare(Person o1, Person o2) {
    // TODO Auto-generated method stub
    return o1.getId()-o2.getId();
}
public String getMethodName()
{
    return "按id正序";
}

}</b></pre>

類IdReverseOrder

package com.jack.SortStrategy;

import java.util.Comparator;

public class IdReverseOrder implements Comparator<Person> {

@Override
public int compare(Person o1, Person o2) {
    // TODO Auto-generated method stub
    return o2.getId()-o1.getId();
}
public String getMethodName()
{
    return "按id逆序";
}

}</b></pre>

類AgeOrder

package com.jack.SortStrategy;

import java.util.Comparator;

public class AgeOrder implements Comparator<Person> {

@Override
public int compare(Person o1, Person o2) {
    // TODO Auto-generated method stub
    int result=o1.getAge()-(o2.getAge());
    if(0==result){                                      //若年齡相同按id排
        return o1.getId()-o2.getId();
    }
    return result;
}
public String getMethodName()
{
    return "按年齡正序";
}

}</b></pre>

類AgeReverseOrder

package com.jack.SortStrategy;

import java.util.Comparator;

public class AgeReverseOrder implements Comparator<Person> {

@Override
public int compare(Person o1, Person o2) {
    // TODO Auto-generated method stub
    int result=o2.getAge()-(o1.getAge());
    if(0==result){                                      //若年齡相同按id排
        return o1.getId()-o2.getId();
    }
    return result;
}
public String getMethodName()
{
    return "按年齡逆序";
}

}</b></pre>

NameOrder

package com.jack.SortStrategy;

import java.util.Comparator;

public class NameOrder implements Comparator<Person> {

@Override
public int compare(Person o1, Person o2) {
    // TODO Auto-generated method stub
    int result=o1.getName().compareTo(o2.getName());
    if(0==result){                                                              //若姓名相同按id排
        return o1.getId()-o2.getId();
    }
    return result;
}
public String getMethodName()
{
    return "按姓名正序";
}

}</b></pre>

類NameReverseOrder

package com.jack.SortStrategy;

import java.util.Comparator;

public class NameReverseOrder implements Comparator<Person> { @Override public int compare(Person o1, Person o2) { // TODO Auto-generated method stub int result=o2.getName().compareTo(o1.getName()); if(0==result){ //若姓名相同按id排 return o1.getId()-o2.getId(); } return result; } public String getMethodName() { return "按姓名逆序"; } }</b></pre>

類Client

package com.jack.SortStrategy;

import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Iterator;

public class Client {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    ArrayList<Person> personList = new ArrayList<Person>();
    personList.add(new Person(1, "zhangsan", 20));
    personList.add(new Person(2, "lisi", 21));
    personList.add(new Person(3, "wangwu", 25));
    personList.add(new Person(4, "zhaoliu", 26));
    personList.add(new Person(5, "chenqi", 28));
    personList.add(new Person(6, "dongba", 10));
    personList.add(new Person(7, "zhansan", 15));
    personList.add(new Person(8, "liujiu", 26));


    /*
     * 可通過這里new不同的Comparator的實現從而實現不同的排序策略
     * 分別有
     *  IdOrder:按Id正序
     *  IdReverseOrder:按Id逆序
     * NameOrder:按姓名正序
     * NameReverseOrder:按姓名逆序
     * AgeOrder:按年齡正序
     * AgeReverseOrder:按年齡逆序
     */
    Comparator<Person> comp = new IdOrder();                        

    Collections.sort(personList, comp);

    System.out.println(((IdOrder)comp).getMethodName()+"  排序后的序列是:");

    System.out.println("-----------------------");

    for (Iterator<Person> itor=personList.iterator();itor.hasNext();) {

        Person p=itor.next();
        System.out.println(p.getId() + "  " +p.getName()+ "  " + p.getAge());
    }

}

}</b></pre>


執行Client可以得到排序的結果

</div>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!