定义:
提供一种方法来访问聚合对象, 而不用暴露这个对象的内部表示。
提供一个外部的迭代器对聚合对象进行访问和遍历,迭代器中定义了一个访问该聚合对象的接口,并且可以跟踪当前遍历的元素, 了解哪些元素已经遍历,哪些没有。
其别名为游标(Cursor)
迭代器模式是一种对象行为型模式
优点:
支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式
简化了聚合类
由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,符合开闭原则
缺点:
在增加新的聚合类时需要对应地增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性
抽象迭代器的设计难度较大,需要充分考虑到系统将来的扩展。 在自定义迭代器时,创建一个考虑全面的抽象迭代器并不是一件 很容易的事情
适用范围:
访问一个聚合对象的内容而无须暴露它的内部表示
需要为一个聚合对象提供多种遍历方式
为遍历不同的聚合结构提供一个统一的接口,在该接口的实现类 中为不同的聚合结构提供不同的遍历方式,而客户端可以一致性地操作该接口
实例:
电视机遥控器就是一个迭代器的实例,通过它可以实现对电视机频道集合的遍历操作,本实例我们将模拟电视机遥控器的实现。
实例UML:
实例目录:
实例代码:
TVIterator.java
package iterator;
//抽象迭代器类(遥控器类)
public interface TVIterator {
void setChannel(int i);
void next();
void previous();
boolean isLast();
Object currentChannel();
boolean isFirst();
}
Television.java
package iterator;
public interface Television {
TVIterator creatIterator();
}
TCLTelevision.java
package iterator;
public class TCLTelevision implements Television {
private Object[] obj={"山西卫视","北京卫视","湖南卫视","湖北卫视","山东卫视","陕西卫视","财经频道","河北卫视"};
@Override
public TVIterator creatIterator() {
return new TCLIterator();
}
private class TCLIterator implements TVIterator{
private int currentIndex;
public void next(){
if (currentIndex<obj.length){
currentIndex++; //此时指针指向数组最后一个元素又加一
}
}
public void previous(){
if (currentIndex>0){
currentIndex--;
}
}
public boolean isLast(){ //last指的是数组最后一个元素又加一
return currentIndex== obj.length;
}
public Object currentChannel(){
return obj[currentIndex];
}
public boolean isFirst(){
return currentIndex==0;
}
public void setChannel(int i){
currentIndex=i;
}
}
}
SkwyworthTelevision.java
package iterator;
public class SkwyworthTelevision implements Television {
private Object[] obj={"CCTY-1","CCTV-2","CCTV-3","CCTV-4","CCTV-5","CCTV-6","CCTV-7","CCTV-7"};
@Override
public TVIterator creatIterator() {
return new SkwyworthIterator();
}
private class SkwyworthIterator implements TVIterator{
private int currentIndex;
public void next(){
if (currentIndex<obj.length){
currentIndex++;
}
}
public void previous(){
if (currentIndex>0){
currentIndex--;
}
}
public boolean isLast(){
return currentIndex== obj.length;
}
public Object currentChannel(){
return obj[currentIndex];
}
public boolean isFirst(){
return currentIndex==0;
}
public void setChannel(int i){
currentIndex=i;
}
}
}
Client.java
package iterator;
public class Client {
public static void display(Television tv){
TVIterator i = tv.creatIterator();
System.out.println("电视机频道:");
while(!i.isLast()){
System.out.println(i.currentChannel().toString());
i.next();
}
}
public static void reverseDisplay(Television tv){
TVIterator i = tv.creatIterator();
i.setChannel(5);
System.out.println("电视机频道:");
while(!i.isFirst()){
i.previous();
System.out.println(i.currentChannel().toString());
}
}
public static void main(String[] args) {
Television tv;
tv=(Television) XMLUtil.getBean();
display(tv);
System.out.println("====================");
reverseDisplay(tv);
System.out.println("软件1928 孟振华 2019006175");
}
}
XMLUtil.java
package iterator;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class XMLUtil {
public static Object getBean() {
try {
//创建文档对象
DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder =dFactory.newDocumentBuilder();
Document doc;
doc=builder.parse(new File("iterator.xml"));
//获取文本节点
NodeList nl=doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue();
Class c=Class.forName(cName);
Object obj=c.newInstance();
return obj;
}
catch(Exception e) {
e.printStackTrace();
return null;
}
}
}
iterator.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<className>iterator.SkwyworthTelevision</className>
</config>
运行结果截图: