Iterator设计模式

Iterator设计模式

客户端希望遍历被放入容器/集合类的一组ADT对象,无需关心容器的具体类型
也就是说,不管对象被放进哪里,都应该提供同样的遍历方式

类结构

  • 可迭代接口
  • 具体类
  • 迭代器接口
  • 具体迭代器

其中可迭代接口,迭代器接口,java中已经实现,我们直接使用即可
可迭代接口:Iterable,需要实现方法Iterator iterator()
迭代器接口:Iterator,通常需要实现2个方法

  • boolean hasNext()
  • E next()
    还有两个default方法,选择实现
  • void remove()
  • void forEachRemaining(Consumer action)

具体类实现Iterable接口

// Aggregate.java
public class Aggregate implements Iterable<Any> {
	@Override
	public Iterator<Any> iterator() {
		// 据情况选择把什么传给iterator,这里比较粗暴
		return new AggregateIterator(this);
	}
}

具体迭代器

// AggregateIterator.java
public class AggregateIterator implements Iterator<Any> {
	// some fields
	// ...
	public AggregateIterator(Aggregate aggregate) {...}
	@Override
	public boolean hasNext() {...}
	@Override
	public Any next() {...}
}

当然,还有一种方式,具体迭代器作为具体类的私有内部类,不用考虑向iterator传值
be like

public class Aggregate implements Iterable<Any> {
	// ...
	private class AggregateIterator implements Iterator<Any> {...}
}

客户端

// 很简单了
Aggregate aggregate = new Aggregate();
Iterator<Any> iterator = aggregate.iterator();
while (iterator.hashNext()) {
	Any any = iterator.next();
	// do something with any
} 

你可能感兴趣的:(设计模式,java,开发语言)