一.模式定义
迭代器模式(Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示。
Iterator Pattern: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
二.模式要素
Iterator: 抽象迭代器
ConcreteIterator: 具体迭代器
Aggregate: 抽象聚合类
ConcreteAggregate: 具体聚合类
三.举例说明
假设有一个容器存放着电视节目。需要一个迭代器来读取该容器中的所有电视节目。
四.具体代码
IIterator.java 迭代器接口
package iteratorPattern;
/**
* @program: Test
* @description:
* @author: Lei Dong
* @create: 2019-05-04 21:11
**/
public interface IIterator {
public boolean hasNext();
public Object next();
}
ConcreteIterator.java 具体迭代器
package iteratorPattern;
/**
* @program: Test
* @description:
* @author: Lei Dong
* @create: 2019-05-04 21:12
**/
public class ConcreteIterator implements IIterator {
int cursor = 0;
String[] channels;
public ConcreteIterator(String[] channels) {
this.channels = channels;
}
@Override
public boolean hasNext() {
return cursor < channels.length;
}
@Override
public Object next() {
if (hasNext()) {
return channels[cursor++];
}
return null;
}
}
IContainer.java 容器接口
package iteratorPattern;
/**
* @program: Test
* @description:
* @author: Lei Dong
* @create: 2019-05-04 21:19
**/
public interface IContainer {
public IIterator getIterator();
}
ConcreteContainer.java 具体容器
package iteratorPattern;
/**
* @program: Test
* @description:
* @author: Lei Dong
* @create: 2019-05-04 21:20
**/
public class ConcreteContainer implements IContainer {
private String[] channels = {"CCTV-1", "CCTV-2", "CCTV-3", "CCTV-4", "CCTV-5"};
@Override
public IIterator getIterator() {
return new ConcreteIterator(channels);
}
}
Main.java
package iteratorPattern;
/**
* @program: Test
* @description:
* @author: Lei Dong
* @create: 2019-05-04 20:31
**/
public class Main {
public static void main(String[] args) {
IContainer container = new ConcreteContainer();
IIterator iterator = container.getIterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
运行结果:
五.总结
1.迭代器模式的优点
(1)它支持以不同的方式遍历一个聚合对象。
(2)迭代器简化了聚合类。
(3)在同一个聚合上可以有多个遍历。
(4)在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。
2.迭代器模式的缺点
(1)由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
3.模式适用场景
(1)访问一个聚合对象的内容而无须暴露它的内部表示。
(2)需要为聚合对象提供多种遍历方式。
(3)为遍历不同的聚合结构提供一个统一的接口。