一、概述
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
二、解决问题
迭代器模式就是提供一种遍历元素的统一接口,用一致的方法遍历聚合元素。试想,如果我们的聚合元素是用不同的方式实现的,有些用了数组,有些用了java的集合类,或者还有其他方式,当客户端要遍历这些元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构。
三、应用实例
下面我用一个在页面展示一个学校院系结构的例子来讲解迭代器的用法,讲完例子后我们再来看看迭代器的结构类图。现在我们的需求是这样,要在一个页面中展示出学校的院系组成,它应该是树状结构的,一个学校有多个学院,一个学院有多个系。当然了,页面的具体代码就不写了,我们就来分析后台的实现方法。
前面学了面向接口编程,我们现在可以把学院抽象出来做成一个接口,设定里面方法有getName,addDepartment(增加一个系),一个可以遍历全部系的方法(暂且取名为CreateIterator,就是返回一个迭代器的方法)。看看接口的代码实现
package com.jet.someinterface;
import java.util.Iterator;
/**
* Created by Administrator on 2016/11/14.
*/
public interface College {
public String getName();
/**
* 增加一个系的方法
*/
public void addDepartment(String name,String description);
/**
*返回一个迭代器用来遍历每一个系
*/
public Iterator createIterator();
}
学院下面的是专业,我们把专业的对象创建出来
package com.jet.com.jet.vo;
/**
* Created by Administrator on 2016/11/14.
* description:专业对象
*/
public class DepartmentVo {
private String name;
private String description;
public DepartmentVo(String name, String description) {
this.name = name;
this.description = description;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
创建第一学院对象(计算机学院),及其对应的迭代器
package com.jet.impl;
import com.jet.com.jet.vo.DepartmentVo;
import com.jet.someinterface.College;
import java.util.Iterator;
/**
* Created by Administrator on 2016/11/14.
* description:计算机学院
*/
public class ComputerCollege implements College{
DepartmentVo[] departmentVos;//用来放置专业对象,注意这里用的是数组
int numberOfDepartments = 0;//保存当前数组已有对象数
static final int MAX_DEPARTMENTS = 4;//控制专业数组大小
public String getName() {
return "计算机学院";
}
public ComputerCollege() {
departmentVos = new DepartmentVo[MAX_DEPARTMENTS];
addDepartment("计算机科学与技术","计算机科学与技术");
addDepartment("软件工程 ","软件工程 ");
addDepartment("网络工程","网络工程");
addDepartment("信息安全","信息安全");
}
public void addDepartment(String name,String description) {
if(numberOfDepartments >= MAX_DEPARTMENTS){
System.out.println("已超过学院最专业数限制,不能添加专业了!");
}else{
DepartmentVo departmentVo = new DepartmentVo(name,description);
departmentVos[numberOfDepartments] = departmentVo;
numberOfDepartments = numberOfDepartments + 1;
}
}
public Iterator createIterator() {
//返回一个遍历器
return new ComputerCollegeIterator(departmentVos);
}
}
package com.jet.impl;
import com.jet.com.jet.vo.DepartmentVo;
import java.util.Iterator;
/**
* Created by Administrator on 2016/11/14.
* decription:计算机学院的遍历器,我们这里是实现了java自带的便利器Iterator
*/
public class ComputerCollegeIterator implements Iterator{
DepartmentVo[] departmentVos;
int position = 0;//遍历的位置
public ComputerCollegeIterator(DepartmentVo[] departmentVos) {
this.departmentVos = departmentVos;
}
public boolean hasNext() {
if(position >= departmentVos.length || departmentVos[position] == null ){
return false;
}els