第二节:迭代器模式——迭代器模式应用

一、应用实例

  1、应用实例要求

    编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个院系。

  2、设计思路分析

  

二、代码实现

  院系类:Element 即容器中存放的,需要来遍历的单位

 1 /**
 2  * 院系
 3  */
 4 public class Department {
 5 
 6     private String name;
 7     private String desc;
 8 
 9     public Department(String name, String desc) {
10         this.name = name;
11         this.desc = desc;
12     }
13 
14     public String getName() {
15         return name;
16     }
17 
18     public void setName(String name) {
19         this.name = name;
20     }
21 
22     public String getDesc() {
23         return desc;
24     }
25 
26     public void setDesc(String desc) {
27         this.desc = desc;
28     }
29 }

  用来遍历计算机学院的 迭代器:

 1 /**
 2  * ComputerCollegeIterator 以数组方式存放
 3  */
 4 public class ComputerCollegeIterator implements Iterator {
 5 
 6     /**
 7      *  这里我们需要知道 Department 是以怎样的方式存放
 8      */
 9     Department[] departments;
10     int position = 0;  //遍历的位置
11 
12 
13     public ComputerCollegeIterator(Department[] departments) {
14         this.departments = departments;
15     }
16 
17     /**
18      * 判断是否还有下一个元素
19      * @return
20      */
21     @Override
22     public boolean hasNext() {
23         if (position >= departments.length || departments[position] == null) {
24             return false;
25         } else {
26             return true;
27         }
28     }
29 
30 
31     @Override
32     public Object next() {
33         Department department = departments[position++];
34         return department;
35     }
36 
37     /**
38      * 删除的方法默认空实现
39      */
40     @Override
41     public void remove() {
42 
43     }
44 }

  用来遍历信息工程学院的 迭代器:

 1 public class InfoCollegeIterator implements Iterator {
 2 
 3     /**
 4      * 信息工程学院是以 List 方式存放系
 5      */
 6     List<Department> departmentList;
 7     int index = -1; //索引
 8 
 9     public InfoCollegeIterator(List<Department> departmentList) {
10         this.departmentList = departmentList;
11     }
12 
13     /**
14      * 判断 list中还有没有下一个元素
15      * @return
16      */
17     @Override
18     public boolean hasNext() {
19         if (index >= departmentList.size() - 1) {
20             return false;
21         } else {
22             index += 1;
23             return true;
24         }
25     }
26 
27     @Override
28     public Object next() {
29         return departmentList.get(index);
30     }
31 
32     @Override
33     public void remove() {
34 
35     }
36 }

  学院的接口:

 1 /**
 2  * 学院的接口
 3  */
 4 public interface College {
 5 
 6     public String getName();
 7 
 8     /**
 9      * 增加院系的方法
10      * @param name
11      * @param desc
12      */
13     public void addDepartment(String name, String desc);
14 
15     /**
16      * 返回一个迭代器,遍历
17      * @return
18      */
19     public Iterator createIterator();
20 }

  计算机学院:

 1 public class ComputerCollege implements College{
 2 
 3     Department[] departments;
 4     int numOfDepartment = 0; //保存当前数组的对象个数
 5 
 6     public ComputerCollege() {
 7         departments = new Department[5];
 8         addDepartment("Java", "Java专业");
 9         addDepartment("C语言", "C专业");
10         addDepartment("大数据", "大数据专业");
11     }
12 
13     @Override
14     public String getName() {
15         return "计算机学院";
16     }
17 
18     @Override
19     public void addDepartment(String name, String desc) {
20         Department department = new Department(name, desc);
21         departments[numOfDepartment++] = department;
22     }
23 
24     @Override
25     public Iterator createIterator() {
26         return new ComputerCollegeIterator(departments);
27     }
28 }

  信息工程学院:

 1 public class InfoCollege implements College{
 2 
 3     List<Department> departmentsList;
 4 
 5     public InfoCollege() {
 6         departmentsList = new ArrayList<Department>();
 7         addDepartment("信息安全", "信息安全专业");
 8         addDepartment("网络安全", "网络安全专业");
 9         addDepartment("服务器安全", "服务器安全专业");
10     }
11 
12     @Override
13     public String getName() {
14         return "信息工程学院";
15     }
16 
17     @Override
18     public void addDepartment(String name, String desc) {
19         Department department = new Department(name, desc);
20         departmentsList.add(department);
21     }
22 
23     @Override
24     public Iterator createIterator() {
25         return new InfoCollegeIterator(departmentsList);
26     }
27 }

  封装一个用于输出的学校信息的类:

 1 public class OutputImpl {
 2 
 3     /**
 4      * 学院集合
 5      */
 6     List<College> collegeList;
 7 
 8     public OutputImpl(List<College> collegeList) {
 9         this.collegeList = collegeList;
10     }
11 
12     /**
13      * 遍历所有学院,然后调用 printDepartment 输出各个学院的系
14      */
15     public void printCollege() {
16         // 从 collegeList 取出所有学院,Java 中的 List 已经实现了Iterator接口
17         Iterator<College> iterator = collegeList.iterator();
18 
19         while (iterator.hasNext()) {
20             //取出一个学院
21             College college = iterator.next();
22             System.out.println("========"+ college.getName() +"==========");
23             printDepartment(college.createIterator());
24         }
25 
26     }
27 
28     /**
29      * 输出学院下面的院系
30      */
31     public void printDepartment(Iterator iterator) {
32         while (iterator.hasNext()) {
33             Department dept = (Department)iterator.next();
34             System.out.println(dept.getDesc());
35         }
36     }
37 }

  客户端:

 1 public class Client {
 2     public static void main(String[] args) {
 3 
 4         //创建学院
 5         List<College> colleges = new ArrayList<>();
 6         colleges.add(new ComputerCollege());
 7         colleges.add(new InfoCollege());
 8 
 9         OutputImpl output = new OutputImpl(colleges);
10         output.printCollege();
11     }
12 }

 

原文地址:https://www.cnblogs.com/niujifei/p/14398791.html