定义
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
这个模式给你提供了一种方法,可以顺序访问一个聚集对象中的元素,而又不用知道内部是如何表示的。
实现
java.util 中的集合类,遍历集合的迭代模式。
java.util.Iterator接口的定义
1
2
3
4
5
|
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public class DinnerMenuIterator implements Iterator {
MenuItem[] items;
// position记录当前数组遍历的位置
int position = 0;
// 构造器需要被传入一个菜单项的数组当做参数
public DinnerMenuIterator(MenuItem[] items) {
this.items = items;
}
// next()方法返回数组内的下一项,并递增其位置
public Object next() {
MenuItem menuItem = items[position];
position = position + 1;
return menuItem;
}
// hasNext()方法会检查我们是否已经取得数组内所有的元素。
// 如果还有元素待遍历,则返回true
public boolean hasNext() {
if (position >= items.length || items[position] == null) {
return false;
} else {
return true;
}
}
}
|
1
2
3
4
5
6
7
8
9
10
|
public class DinnerMenu {
MenuItem[] menuItems;
// 我们不再需要getMenuItems()方法,事实上,我们根本不想要这个方法,
// 因为它会暴露我们内部的实现。
// 这是createIterator()方法,用来从菜单项数组创建一个DinnerMenuIterator,
// 并将它返回给客户
public Iterator createIterator() {
return new DinnerMenuIterator(menuItems);
}
}
|
意义
单一责任,一个类应该只有一个引起变化的原因。
因为修改代码很容易造成许多潜在的错误。如果有一个类具有两个改变的原因,那么这会使得将来该类的变化几率上升,而当它真的改变时,你的设计中同时有两个方面将会受到影响。
区分设计中的责任,是最困难的事情之一。我们的大脑很习惯看着一大群的行为,然后将它们集中在一起,尽管他们可能属于两个或者多个不同的责任。想要成功的唯一方法,就是努力不懈地检查你的设计,随着系统的成长,随时观察有没有迹象显示某个类改变的原因超出一个。