zoukankan      html  css  js  c++  java
  • 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是一个接口,但是函数返回的不是接口,而是实现了该接口的一个对象!!!!!!!!!!!!!!!!

      

    ===========所有内容均为本人学习所用,如有侵权问题请联系本人。=============== ======================但行好事 莫问前程========================
  • 相关阅读:
    CMake 从文件路径中提取文件名
    std::multimap 按照key遍历---
    Windows / Linux 一件编译zlib库
    C++ 11 可变模板参数的两种展开方式
    cmake 生成VS项目文件夹
    C++ 利用文件流复制文件
    利用 getsockname 和 getpeername 来获取某一个链接的本地地址和远端地址
    Windows 用VS编译libevent源码
    揭示同步块索引(上):从lock开始
    C手写一个多线程,供java调用
  • 原文地址:https://www.cnblogs.com/yhd-2018/p/9465825.html
Copyright © 2011-2022 走看看