分享

迭代器模式一访问人员列表

 WindySky 2018-02-25

一模式定义

迭代器模式,提供了一种模式顺序访问一个集合对象中各个元素的功能,而又不暴露其内部的表示。

 

二模式举例

1模式分析

我们借用访问人员列表这一案例来说明这一模式。

2迭代器模式静态类图



 

3代码示例

3.1 人员信息接口——IPerson

Java代码  收藏代码
  1. package com.demo.person;  
  2.   
  3. /** 
  4.  * 人员信息 
  5.  *  
  6.  * @author 
  7.  *  
  8.  */  
  9. public interface IPerson  
  10. {  
  11.     /** 
  12.      * 获得人员信息 
  13.      *  
  14.      * @return 
  15.      */  
  16.     public String getPersonInfo();  
  17.   
  18. }  

 

3.2 人员信息实现——Person

Java代码  收藏代码
  1. package com.demo.person;  
  2.   
  3. /** 
  4.  * 人员具体实现类 
  5.  *  
  6.  * @author 
  7.  *  
  8.  */  
  9. public class Person implements IPerson  
  10. {  
  11.     // 姓名  
  12.     private String name;  
  13.     // 年龄  
  14.     private int age;  
  15.     // 性别(1:男性 0:女性)  
  16.     private int sex;  
  17.   
  18.     /** 
  19.      * 构造方法设置属性内容 
  20.      *  
  21.      * @param name 
  22.      * @param age 
  23.      * @param sex 
  24.      */  
  25.     public Person(String name, int age, int sex)  
  26.     {  
  27.         this.name = name;  
  28.         this.age = age;  
  29.         this.sex = sex;  
  30.     }  
  31.   
  32.     /** 
  33.      * 获得人员信息 
  34.      *  
  35.      * @return 
  36.      */  
  37.     public String getPersonInfo()  
  38.     {  
  39.         return "姓名:" + this.name + " - 年龄:" + this.age + " - 性别:" + (this.sex == 1 ? "男" : (this.sex == 0 ? "女" : ""));  
  40.     }  
  41.   
  42. }  

 

3.3 人员集合接口——IPersonList

Java代码  收藏代码
  1. package com.demo.person;  
  2.   
  3. import com.demo.iterator.Iterator;  
  4.   
  5. /** 
  6.  * 人员接口 
  7.  *  
  8.  * @author 
  9.  *  
  10.  */  
  11. public interface IPersonList {  
  12.     /** 
  13.      * 获得内部存储人员信息内容 
  14.      *  
  15.      * @return 
  16.      */  
  17.   
  18.     public IPerson[] getPersonList();  
  19.   
  20.     /** 
  21.      * 迭代器 
  22.      *  
  23.      * @return 
  24.      */  
  25.     public Iterator iterator();  
  26. }  

 

3.4 人员集合实现——PersonList

Java代码  收藏代码
  1. package com.demo.person;  
  2.   
  3. import java.util.Random;  
  4.   
  5. import com.demo.iterator.ArrPersonIterator;  
  6. import com.demo.iterator.Iterator;  
  7.   
  8. /** 
  9.  * 人员列表信息 
  10.  *  
  11.  * @author 
  12.  *  
  13.  */  
  14. public class PersonList implements IPersonList {  
  15.     // 存储用户信息列表  
  16.     private final IPerson[] list = new IPerson[10];  
  17.   
  18.     // 构造方法初始化人员信息  
  19.     public PersonList() {  
  20.         Random random = new Random();  
  21.         // 创建人员信息  
  22.         for (int i = 0; i < 10; i++) {  
  23.             IPerson person = new Person("人员" + i, random.nextInt(30), random  
  24.                     .nextInt(2));  
  25.             list[i] = person;  
  26.             // this.list.add(person);  
  27.         }  
  28.     }  
  29.   
  30.     /** 
  31.      * 获得内部存储人员信息内容 
  32.      *  
  33.      * @return 
  34.      */  
  35.   
  36.     public IPerson[] getPersonList() {  
  37.         return list;  
  38.     }  
  39.   
  40.     /** 
  41.      * 迭代器 
  42.      *  
  43.      * @return 
  44.      */  
  45.     public Iterator iterator() {  
  46.         return new ArrPersonIterator(this.list);  
  47.     }  
  48. }  

 

3.5 迭代器接口——Iterator

Java代码  收藏代码
  1. package com.demo.iterator;  
  2.   
  3. /** 
  4.  * 迭代器接口 
  5.  *  
  6.  * @author 
  7.  *  
  8.  */  
  9. public interface Iterator {  
  10.   
  11.     // 判断是否含有下一个届节点  
  12.     public boolean hasNext();  
  13.   
  14.     // 获得下一个节点对象  
  15.     public Object next();  
  16.   
  17.     // 删除对象  
  18.     public Object remove();  
  19. }  

 

3.6 迭代器实现——ArrPersonIterator

Java代码  收藏代码
  1. package com.demo.iterator;  
  2.   
  3. import com.demo.person.IPerson;  
  4.   
  5. /** 
  6.  * 数组迭代器实现 
  7.  *  
  8.  * @author 
  9.  *  
  10.  */  
  11. public class ArrPersonIterator implements Iterator {  
  12.     // 私有属性存储人员列表对象信息  
  13.     private final IPerson[] personList;  
  14.     // 存储位置信息 初始值为-1  
  15.     private int index = -1;  
  16.   
  17.     /** 
  18.      * 构造方法将人员列表对象传入 
  19.      *  
  20.      * @param personList 
  21.      */  
  22.     public ArrPersonIterator(IPerson[] personList) {  
  23.         this.personList = personList;  
  24.     }  
  25.   
  26.     // 判断是否含有下一个节点  
  27.     public boolean hasNext() {  
  28.         return (this.personList == null ? false  
  29.                 : (index < this.personList.length - 1));  
  30.     }  
  31.   
  32.     // 获得下一个节点对象  
  33.     public Object next() {  
  34.         if (this.personList != null && (index < this.personList.length - 1)) {  
  35.             // 获得人员列表对象中的人员信息  
  36.             return this.personList[++index];  
  37.         }  
  38.         return null;  
  39.     }  
  40.   
  41.     // 删除对象  
  42.     public Object remove() {  
  43.         if (this.personList != null) {  
  44.             IPerson person = this.personList[index];  
  45.             this.personList[index] = null;  
  46.             return person;  
  47.         }  
  48.   
  49.         return null;  
  50.     }  
  51.   
  52. }  

 

3.7 让迭代器遍历集合对象——Client

Java代码  收藏代码
  1. package com.demo;  
  2.   
  3. import com.demo.iterator.Iterator;  
  4. import com.demo.person.IPerson;  
  5. import com.demo.person.IPersonList;  
  6. import com.demo.person.PersonList;  
  7.   
  8. public class Client {  
  9.   
  10.     /** 
  11.      * @param args 
  12.      */  
  13.     public static void main(String[] args) {  
  14.         // 创建人员列表对象  
  15.         IPersonList personList = new PersonList();  
  16.         System.out.println("----使用迭代器输出人员信息 start......");  
  17.         // 生成迭代器  
  18.         Iterator iterator = personList.iterator();  
  19.         // 循环迭代器 遍历每一个元素输出人员信息  
  20.         while (iterator.hasNext()) {  
  21.             // 获得人员对象实例  
  22.             IPerson person = (IPerson) iterator.next();  
  23.             if (person != null) {  
  24.                 // 输出人员信息  
  25.                 System.out.println(person.getPersonInfo());  
  26.             }  
  27.         }  
  28.         System.out.println("----使用迭代器输出人员信息   end......");  
  29.   
  30.     }  
  31. }  

 

4运行结果

----使用迭代器输出人员信息 start......

姓名:人员0 - 年龄:28 - 性别:女

姓名:人员1 - 年龄:25 - 性别:女

姓名:人员2 - 年龄:23 - 性别:女

姓名:人员3 - 年龄:18 - 性别:女

姓名:人员4 - 年龄:27 - 性别:女

姓名:人员5 - 年龄:28 - 性别:男

姓名:人员6 - 年龄:25 - 性别:女

姓名:人员7 - 年龄:23 - 性别:女

姓名:人员8 - 年龄:16 - 性别:男

姓名:人员9 - 年龄:12 - 性别:女

----使用迭代器输出人员信息   end......

 

三该模式设计原则

1"开一闭"原则

2单一职责原则

 

四使用场合

1访问一个集合对象的内容,而无须暴露它的内部表示。

2支持对集合对象的多种遍历方式。

3为遍历不同的集合对象结构提供一个统一的接口。

 

五迭代器模式静态类图



 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多