书城计算机网络大话设计模式
8183300000218

第218章 6 用Iterator模式实现遍历集合

小A:“怎样用Iterator模式实现遍历集合?”

大B:“Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:for(int i=0;i<array。size();i ){……get(i)……}而访问一个链表(LinkedList)又必须使用while循环:while((e=e。next())!=null){……e。data()……}以上两种方法客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦合,无法将访问逻辑从集合类和客户端代码中分离出来,每一种集合对应一种遍历方法,客户端代码无法复用。更恐怖的是,如果以后需要把ArrayList更换为LinkedList,则原来的客户端代码必须全部重写。”

小A:“那我们应该怎样去解决这此问题哩?”

大B:“为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合:for(Iterator it=c。iterater();it。hasNext();){……}奥秘在于客户端自身不维护遍历集合的‘指针’,所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。客户端从不直接和集合类打交道,它总是控制Iterator,向它发送‘向前’,‘向后’,‘取当前元素’的命令,就可以间接遍历整个集合。这样看来实现Iterator的目的是降低耦合以及实现统一的遍历模式吧。在JS里面,遍历数组和遍历Object是不一样的,一般数组是for(i=0;i<length;i )这样,Object就要for in 了,用了Iterator后可以达到写法的一致,就不用管需要遍历的是什么类型对象了。”