迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
迭代器模式属于行为型模式。
意图:
提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。主要解决:
不同的方式来遍历整个整合对象。何时使用:
遍历一个聚合对象。如何解决:
把在元素之间游走的责任交给迭代器,而不是聚合对象。关键代码:
定义接口:hasNext, next。应用实例
JAVA 中的 iterator。优点 :
1、它支持以不同的方式遍历一个聚合对象。2、迭代器简化了聚合类。3、在同一个聚合上可以有多个遍历。4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。缺点:
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。使用场景 :
1、访问一个聚合对象的内容而无须暴露它的内部表示。2、需要为聚合对象提供多种遍历方式。3、为遍历不同的聚合结构提供一个统一的接口。注意事项:
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。下面使用打印不同学院下面的专业信息来演示
先创建专业类
/** * 表示专业 */ public class Department { private String name; private String desc; public Department(String name, String desc) { super(); this.name = name; this.desc = desc; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }然后创建不同的学院,学院下面有很多专业,但是聚合的集合类型不一样
学院接口
/** * 学院的接口 */ public interface College { String getName(); //增加系的方法 void addDepartment(String name, String desc); //返回一个迭代器,遍历 Iterator iterator(); }计算机学院
/** * 计算机学院 */ public class ComputerCollege implements College { /** * 计算机学院的专业设置成数组 */ Department[] departments; /** * 保存当前数组的对象个数 */ int numOfDepartment = 0; public ComputerCollege() { departments = new Department[5]; addDepartment("Java专业", " Java专业 "); addDepartment("PHP专业", " PHP专业 "); addDepartment("大数据专业", " 大数据专业 "); } @Override public String getName() { return "计算机学院"; } @Override public void addDepartment(String name, String desc) { Department department = new Department(name, desc); departments[numOfDepartment] = department; numOfDepartment += 1; } @Override public Iterator iterator() { return new ComputerCollegeIterator(departments); } }信息学院
/** * 信息学院 */ public class InfoCollege implements College { /** * 信息学院的专业设置成集合 */ List<Department> departmentList; public InfoCollege() { departmentList = new ArrayList<>(); addDepartment("信息安全专业", " 信息安全专业 "); addDepartment("网络安全专业", " 网络安全专业 "); addDepartment("服务器安全专业", " 服务器安全专业 "); } @Override public String getName() { return "信息工程学院"; } @Override public void addDepartment(String name, String desc) { Department department = new Department(name, desc); departmentList.add(department); } public Iterator iterator() { return new InfoCollegeIterator(departmentList); } }然后是实现不同学院的迭代器,通过实现Iterator接口来实现
/** * 计算机学院的迭代器 */ public class ComputerCollegeIterator implements Iterator { Department[] departments; int position = 0; //遍历的位置 public ComputerCollegeIterator(Department[] departments) { this.departments = departments; } /** * 判断是否还有下一个元素 * * @return */ @Override public boolean hasNext() { if (position >= departments.length || departments[position] == null) { return false; } else { return true; } } /** * 取一个元素,并且下标+1 * * @return */ @Override public Object next() { Department department = departments[position]; position += 1; return department; } } /** * 信息学院的迭代器 */ public class InfoCollegeIterator implements Iterator { List<Department> departmentList; // 信息工程学院是以List方式存放系 int index = -1;//索引 public InfoCollegeIterator(List<Department> departmentList) { this.departmentList = departmentList; } /** * 判断list中还有没有下一个元素 * * @return */ @Override public boolean hasNext() { if (index >= departmentList.size() - 1) { return false; } else { return true; } } @Override public Object next() { index += 1; return departmentList.get(index); } }然后创建客户端打印一下
public class Client { public static void main(String[] args) { //创建学院 List<College> collegeList = new ArrayList<>(); ComputerCollege computerCollege = new ComputerCollege(); InfoCollege infoCollege = new InfoCollege(); collegeList.add(computerCollege); collegeList.add(infoCollege); //遍历打印学院信息 for (College college : collegeList) { System.out.println("=== " + college.getName() + "====="); Iterator iterator = college.iterator(); while (iterator.hasNext()) { Department d = (Department) iterator.next(); System.out.println(d.getName()); } } } }