Andy Back-end Dev Engineer

设计模式-迭代器模式


迭代器模式概述

迭代器模式又叫游标(Cursor)模式,是对象的行为模式。迭起器模式可以顺序地访问一个集合中的元素而不必暴露集合的内部表象。

集合需要迭代器的原因

集合对象必须提供适当的方法,使得程序员可以按照一个线性顺序遍历所有的元素对象,把元素对象提取出来或者删除掉等,一个使用集合的系统肯定会使用这些方法操纵集合对象,因此有可能出现两种问题:

  1. 迭代逻辑没有改变,但是需要将一种集合换成另一种集合。因为不同的集合具有不同的遍历接口,所有需要修改代码。
  2. 集合不会改变,但是迭代方法需要改变。比如原来只需要进行遍历,但是现在需要对元素进行过滤,这是就要修改遍历方法。

出现上述情况的原因是没有符合”开-闭原则”,即没有把不变的结构从系统中抽象出来。

迭代器模式就是将迭代逻辑封装到一个独立的迭代子对象中,从而与集合本身分隔开。 不同的集合对象可以提供相同的迭代器对象,从而客户端无需知道集合的底层结构。 一个集合也可以提供多个迭代器对象,从而是的白能力逻辑的变化不会影响集合对象本身。

迭代器模式的结构

迭代器UML

代码举例:

public interface Iterator<Item> {
	Item next();
	boolean hasNext();
}
public interface Aggregate<Item> {
	Iterator<Item> CreateIterator();
}
public class ConcreteAggregate<Item> implements Aggregate<Item>{
	
	private Integer[] items;
	
	public ConcreteAggregate() {
		items = new Integer[10];
		for(int i=0; i<10; i++) {
			items[i] = i;
		}
	}
	
	@Override
	public Iterator CreateIterator() {
		return new ConcreteIterator<Integer>(items);
	}
}
public class ConcreteIterator<Item> implements Iterator<Item>{
	private Item[] items;
	private int position = 0;
	
	public ConcreteIterator(Item[] items) {
		super();
		this.items = items;
	}

	@Override
	public Item next() {
		return items[position++];
	}

	@Override
	public boolean hasNext() {
		return position < items.length;
	}

}
public class Test {
	public static void main(String[] args) {
		ConcreteAggregate<Integer> aggregate = new ConcreteAggregate<>();
		Iterator<Integer> iterator = aggregate.CreateIterator();
		while (iterator.hasNext()) {
			Object next = iterator.next();
			System.out.println(next);
		}
	}
}

下一篇 常用工具-git

Comments

Content