设计模式之迭代器模式

内容抄自《设计模式》清华大学出版社,2011

模式动机:

对List或Set等集合中的元素进行遍历

模式定义:

提供一种方法来访问集合,而不用暴露这个集合对象的内部表示,其别名为游标(Cursor)。

结构分析:

设计模式之迭代器模式

包含角色:
1.Aggregate 抽象集合类(内部可以用不同的数据结构存储元素)
2.ConcreteAggregate  具体集合类
3.Iterator 抽象迭代器(可以实现不同的迭代方式)
4.ConcreteIterator  具体迭代器

优点:

  • 1.它支持以不同的方式遍历一个聚合对象。
  • 2.增加新的聚合类和迭代器类都很方便,符合开闭。

缺点:

增加新的聚合类要对应增加新的迭代器类,类的个数成对增加,在一定程度上增加了系统的复杂性。

适用环境:

  • 1.访问一个聚合对象的内容而无须暴露它的内部表示。
  • 2.需要为聚合对象提供多种遍历方式。
  • 3.为遍历不同的聚合结构提供一个统一的接口。

栗子:

public class Example {

	static interface Iterator{
		public boolean hasNext();
		public Object next();
	}
	
	static class ConcreteIterator implements Iterator{
		private ConList conList;
		private int index = 0;
		public ConcreteIterator(ConList conList) {
			this.conList = conList;
		}
		@Override
		public boolean hasNext() {
			return index<conList.objs.length;
		}
		@Override
		public Object next() {
			Object object = conList.objs[index];
			index++;
			return object;
		}
	}
	
	static interface AbsList{
		public Iterator create();
	}
	
	static class ConList implements AbsList{
		public Object[] objs = new Object[20];
		@Override
		public Iterator create() {
			return new ConcreteIterator(this);
		}
	}
	
	public static void main(String[] args) {
		ConList conList = new ConList();
		conList.objs[0] = "ss";
		conList.objs[1] = 1;
		conList.objs[2] = 3;
		conList.objs[3] = "ss22";
		Iterator iterator = conList.create();
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
		ArrayList<String> s = new ArrayList<>();
	}
}