Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44117
  • 博文数量: 10
  • 博客积分: 253
  • 博客等级: 二等列兵
  • 技术积分: 131
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-09 08:08
文章分类
文章存档

2012年(10)

我的朋友

分类: Java

2012-04-11 19:10:53

昨天学习下策略模式,做了下老师留的题。
Person类包含id,age,name属性,要求对Person的list排序,升序或降序,依照不同属性。

首先,定义一个抽象策略类,仅说明此接口实现类可提供sort功能。

点击(此处)折叠或打开

  1. package Strategy;


  2. import java.util.List;

  3. public interface MySorter {    
  4.     public void Sort(List<Person> l);
  5. }

接下来,定义这个接口的实现类,也就是具体策略的实现。
策略一,升序排序,按照Person类不同的属性进行

点击(此处)折叠或打开

  1. package Strategy;

  2. import java.util.Collections;
  3. import java.util.Comparator;

  4. import java.util.List;

  5. public class SoterAsc implements Comparator<Person>,MySorter {

  6.     private int charac = 1;

  7.     public SoterAsc(int charac) {
  8.         this.charac = charac;
  9.     }

  10.     public int compare(Person p1, Person p2) {

  11.         switch (charac) {

  12.         case (1): {
  13.             return p1.id - p2.id;
  14.         }
  15.         case (2): {
  16.             return p1.name.compareTo(p2.name);
  17.         }
  18.         default:
  19.             return -1;
  20.         }
  21.     }

  22.     public void Sort(List<Person> l) {
  23.         Collections.sort(l, this);
  24.     }

  25. }
SorterAsc类,同时实现了MySorter类,和Comparator类。
参数charac用来指明用何种属性来升序排序。
等于1时用id排,等于2时用名字排。

接下来定义环境角色,因为环境角色要持有策略类的引用,所以,定义了一个ArrayList的子类,其中有一个:MySorter的引用。这里,类比TreeSet中的Comparator引用。

点击(此处)折叠或打开

  1. package Strategy;

  2. import java.util.ArrayList;

  3. public class SortedArrayList extends ArrayList<Person>{

  4.     private static final long serialVersionUID = 1L;
  5.     public MySorter sa = null;

  6.     public SortedArrayList(MySorter sa) {
  7.         super();
  8.         this.sa = sa;
  9.     }
  10. }
接下来是测试类,从一个data文件中多出人的信息,将其排序,并打印结果

点击(此处)折叠或打开

  1. package Strategy;

  2. import java.io.BufferedReader;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. import java.util.Iterator;

  6. public class Test {

  7.     public static void main(String[] args) throws IOException {

  8.         MySorter sa = new SoterAsc(2);//实例化一个策略类,指定用name进行升序排序
  9.         SortedArrayList list = new SortedArrayList(sa);//实例化一个环境对象,持有刚才策略类对象的引用

  10.         BufferedReader bf = new BufferedReader(new FileReader("d:/data"));
  11.         String id = "";
  12.         String age = "";
  13.         String name = "";

  14.         while (true) {
  15.             id = bf.readLine();
  16.             if (id == null) {
  17.                 break;
  18.             }
  19.             age = bf.readLine();
  20.             name = bf.readLine();

  21.             Person tmp = new Person(Integer.parseInt(id),
  22.                     Integer.parseInt(age), name);
  23.             list.add(tmp);

  24.         }

  25.         list.sa.Sort(list);//调用策略类进行排序

  26.         for (Iterator<Person> iter = list.iterator(); iter.hasNext();) {
  27.             Person p = iter.next();
  28.             System.out.println("id : " + p.id + " age: " + p.age + " name: "
  29.                     + p.name);

  30.         }

  31.     }

  32. }

data 内容如下

点击(此处)折叠或打开

  1. 1001
  2. 22
  3. lihao
  4. 1002
  5. 23
  6. xiaoming
  7. 1004
  8. 20
  9. toto
  10. 1003
  11. 23
  12. titi
  13. 1006
  14. 16
  15. tata
  16. 1009
  17. 24
  18. wanghao

打印结果为


点击(此处)折叠或打开

  1. id : 1001 age: 22 name: lihao
  2. id : 1006 age: 16 name: tata
  3. id : 1003 age: 23 name: titi
  4. id : 1004 age: 20 name: toto
  5. id : 1009 age: 24 name: wanghao
  6. id : 1002 age: 23 name: xiaoming

阅读(645) | 评论(0) | 转发(0) |
0

上一篇:随笔

下一篇:11/04 学习记录 Java Thread

给主人留下些什么吧!~~