迭代器模式
迭代器模式: 举例,当有两种集合类型时(List和数组),如果需要对外提供对这两种集合遍历的接口,但是又不想把自己类的数据结构暴露出去时,这样的情况下就可以使用迭代器模式。
迭代器模式,就是对外只提供一种遍历方式,真正的遍历方式封装在自己类的内部。
举例:
在学校中,学校下是学院,学院下是专业。有两个学院分别是计算机学院和信息学院,在计算机学院下有计算机专业和软件专业。在信息学院下有通信专业和信息专业。
计算机学院下的专业放在数组中,信息学院的专业放在List中,如果外部调用者需要同时遍历这两个学院的专业,在一般情况下,就是外部调用者需要知道集合的类型,再去做遍历,如果使用迭代器模式,则可使用如下方法:
Itertor:JDK自带的迭代器接口;
ComputerCollegeItertor:计算机学院的迭代器,这里面的数据结构是数组存放的专业;
InfoCollegeItertor:信息学院的迭代器,这里面的数据结构是List存放的专业;
Department:存放专业的属性字段;
College:定义一个返回迭代器的方法
ComputerCollege:实现College类,实现返回迭代的方法,根据自己判断,返回那种类型的迭代方式(数组);
InfoCollege:实现College类,实现返回迭代的方法,根据自己判断,返回那种类型的迭代方式(数List);
OutPutImpl:统一返回迭代器;
import java.util.Iterator;
import java.util.List;
/**
* 遍历方式1,这个类使用List存放值,所以需要遍历list
*/
public class ComputerCollegeItertor<T> implements Iterator<T> {
private List<T> datas;
private Integer index = 0;
public ComputerCollegeItertor(List<T> datas) {
this.datas = datas;
}
public boolean hasNext() {
if (datas == null || datas.size() == 0 || index >= datas.size()) {
return false;
}
return true;
}
public T next() {
T t = datas.get(index);
index ++;
return t;
}
public void remove() {
}
}
import java.util.Iterator;
/**
* 遍历方式2,这个类使用数组存放值,所以需要遍历数组
*/
public class InfoCollegeItertor<T> implements Iterator<T> {
private T[] datas;
private Integer index = 0;
public InfoCollegeItertor(T[] datas) {
this.datas = datas;
}
public boolean hasNext() {
if (datas == null || datas.length == 0 || index >= datas.length || datas[index] == null) {
return false;
}
return true;
}
public T next() {
T t = datas[index];
index++;
return t;
}
public void remove() {
}
}
/**
* 被遍历的元素
*/
public class Depratment {
private String name;
public Depratment(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
import java.util.Iterator;
/**
* 定义一个返回迭代器的类
*/
public abstract class College {
private String name;
public abstract Iterator createIterator();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
import java.util.Iterator;
/**
* 定义一个计算机学院类
*/
public class ComputerCollege extends College {
private Depratment[] depratments;
{
setName("计算机学院");
depratments = new Depratment[5];
depratments[0] = new Depratment("计算机专业");
depratments[1] = new Depratment("软件专业");
}
public Iterator createIterator() {
return new InfoCollegeItertor(depratments);
}
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 定义一个信息学院类
*/
public class InfoCollege extends College {
private List<Depratment> depratments;
{
setName("信息学院");
depratments = new ArrayList<Depratment>();
depratments.add(new Depratment("信息专业"));
depratments.add(new Depratment("通信专业"));
}
public Iterator createIterator() {
return new ComputerCollegeItertor(depratments);
}
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 对外输出
*/
public class OutIterator {
private List<College> colleges = new ArrayList<College>();
public void add(College college){
colleges.add(college);
}
public void print(){
for (College college : colleges) {
Iterator<Depratment> iterator = college.createIterator();
System.out.println("==========="+ college.getName() +"==========");
while (iterator.hasNext()){
Depratment next = iterator.next();
System.out.println("===="+ next.getName() +"====");
}
}
}
}
/**
* 测试
*/
public class Test {
public static void main(String[] args) {
OutIterator outIterator = new OutIterator();
outIterator.add(new ComputerCollege());
outIterator.add(new InfoCollege());
outIterator.print();
}
}
===========计算机学院==========
====计算机专业====
====软件专业====
===========信息学院==========
====信息专业====
====通信专业====