Iterator 其实很简单(最好理解的工厂模式的例子)

  我们都知道Iterator是一个典型的工厂模式的例子。那么我们可能会被这两个名词搞晕。首先,我们会奇怪,为什么iterator可以遍历不同类型的结合,其次,出入程序猿的我们根本不知道工厂模式是什么。

  首先,我们先放下疑问,来看一下最基本的两个集合。那就是ArrayList和LinkList。需要学习的是什么呢?

  1.ArrayList是基于数组实现,LinkList是基于链表实现。

  2.实现不同,所以对集合的操作也就不同,如:增,删等。

  3.实现不同,遍历方式也不同,但。。。。。。。我们都可以用iterator来遍历,是不是很神奇。

  重点来了,说了这么多,那到底为什么iterator可以实现? 很简单,那就是------------------------------------interface

  我们都知道ArrayList和LinkList都继承了Cllection接口,实现接口中的add(),size()等方法。然后呢?其实Cllection接口中还有iterator方法,此方法返回一个Iterator类型的接口,对接口,你没有看错,类似于这样:public Iterator iterator() 其中,Iterator是一个接口

  那么大佬要说了,接口怎么可以作为返回值呢?确实是的,接口是不能作为返回值的,所以我上面说的是错的。正确的理解是其实函数返回的不是接口,而是实现了该接口的一个对象,这时这个Iterator 就代表着这个对象。只要是实现该接口的对象都可以赋给n,这种写法是面向对象特有的东西,通常叫作多态。

  这个问题解释清楚了,继续说,ArrayList和LinkList都继承了Cllection接口,所以他们里面也要有iterator这个方法。我们知道Iterator里面有hasnext(),next(),remove()方法,所以根据上面的要求,ArrayList和LinkList中都要有一个类继承Iterator接口并且这个类要包含hasnext(),next(),remove()方法。

  到这里我们可以往回看了,我们常写的代码是:Iterator it = al.iterator() 或 Iterator it = ll.iterator() 其中,al是一个ArrayList类型的集合,ll是一个LinkList类型的集合。

  Iterator it = list.iterator();
  while(it.hasNext()){
    //using “it.next();”do some businesss logic
  }

  1.ArrayList和LinkList都继承了Cllection接口-->都包含各自的iterator()方法

  2.ArrayList和LinkList里面都有一个方法继承了Iterator,且方法实现hasnext(),next(),remove()。

  所以Iterator it = al.iterator() 或 Iterator it = ll.iterator()成立。

  重要:Iterator是一个接口,但是函数返回的不是接口,而是实现了该接口的一个对象!!!!!!!!!!!!!!!!

  

猜你喜欢

转载自www.cnblogs.com/yhd-2018/p/9465825.html