目录

迭代器模式

Iterator Pattern

定义

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

这个模式给你提供了一种方法,可以顺序访问一个聚集对象中的元素,而又不用知道内部是如何表示的。

实现

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);
    }
}

意义

单一责任,一个类应该只有一个引起变化的原因。

因为修改代码很容易造成许多潜在的错误。如果有一个类具有两个改变的原因,那么这会使得将来该类的变化几率上升,而当它真的改变时,你的设计中同时有两个方面将会受到影响。

区分设计中的责任,是最困难的事情之一。我们的大脑很习惯看着一大群的行为,然后将它们集中在一起,尽管他们可能属于两个或者多个不同的责任。想要成功的唯一方法,就是努力不懈地检查你的设计,随着系统的成长,随时观察有没有迹象显示某个类改变的原因超出一个。