迭代器模式 Iterator Pattern
设计原则 九:
单一责任原则,一个类应该只有一个引起变化的原因。
将一个责任只委派给一个类。
类的每个责任都有一个潜在的改变区域,超过一个责任意味着超过一个改变区域,
定义迭代器模式:
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
用迭代器来封装集合对象的遍历细节,使调用者能够通过统一的接口来实现对集合的遍历,迭代器也给集合对象提供了一定的保护,想要遍历集合,直接调用迭代器的方法就好了,我们不知道也不必知道集合内部的数据管理方式。
类图
例图
代码
迭代器接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package IteratorPattern;
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next(); }
|
还需要实现一些具体的迭代器来实现遍历细节:
Array迭代器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| package IteratorPattern;
public class ArrayIterator implements Iterator{ MyObject[] arr; int index = 0; public ArrayIterator(MyObject[] arr){ this.arr = arr; } @Override public boolean hasNext() { if(index < arr.length && arr[index] != null) return true; return false; } @Override public Object next() { MyObject mo = arr[index]; index++; return mo; } }
|
P.S.注意Array迭代器的hasNext方法的具体实现
List迭代器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| package IteratorPattern; import java.util.List;
public class ListIterator implements Iterator{ List<MyObject> list; int index = 0; public ListIterator(List<MyObject> list){ this.list = list; } @Override public boolean hasNext() { if(index < list.size()) return true; return false; } @Override public Object next() { MyObject mo = list.get(index); index++; return mo; } }
|
有了这些具体迭代器,我们只需要一个循环就可以搞定了:
1 2 3 4 5 6 7 8 9
|
private static void printObjs(Iterator iter){ while(iter.hasNext()){ System.out.println(iter.next().toString()); } }
|