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是一个接口,但是函数返回的不是接口,而是实现了该接口的一个对象!!!!!!!!!!!!!!!!
Iterator 其实很简单(最好理解的工厂模式的例子)的更多相关文章
- 菜鸟理解的工厂模式(Factory Pattern)是什么样子的?
直接开始说了,不浪费园友宝贵的时间! 什么是工厂模式? 在学习前,先问一下:"它是什么?". 工厂模式,它是项目里面常用的设计模式之一. 它是属于创建型模式,简单的理解创建型模式就 ...
- js对于工厂模式的理解
有很多人对工厂模式有着这样或者那样不理解的地方,今天我就和大家分享一下我的心得. 其实工厂模式是基于面向对象的一种模式.大家先看这样的一段代码: 其实这个程序很简单,学过js的人都会写,基本没什么问题 ...
- Java简单工厂模式以及来自lambda的优化
前言 设计模式是软件工程中一些问题的统一解决方案的模型,它的出现是为了解决一些普遍存在的,却不能被语言特性直接解决的问题,随着软件工程的发展,设计模式也会不断的进行更新,本文介绍的是经典设计模式 ...
- 设计模式之简单工厂模式(Simple Factory)
原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2579100.html 今天呢,要学习的设计模式是“简单工厂模式”,这是一个 ...
- JavaScript设计模式--简单工厂模式
一,介绍 工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类. 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类.该模式使一个类的实例化延迟到了子类.而子类可以重写接口 ...
- Java设计模式(三)简单工厂模式
定义与类型 定义:由一个工厂对象决定创建出哪一种产品类的实例 类型:创建型,但不属于GOF23种设计模式 适用场景 工厂类负责创建的对象比较少 客户端(应用层)只知道传入工厂类的参数,对于如何创建对象 ...
- C#设计模式(3):抽象工厂模式(Abstract Factory)(转载)
概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来 ...
- .NET设计模式(3):抽象工厂模式(Abstract Factory)(转)
概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来 ...
- .NET设计模式(3):抽象工厂模式(Abstract Factory)
):抽象工厂模式(Abstract Factory) 抽象工厂模式(Abstract Factory) --探索设计模式系列之三 Terrylee,2005年12月12日 转载:http://terr ...
随机推荐
- CareerCup Questions List 职业杯题目列表
网站 www.careercup.com 上的题库列表 # Title Difficulty Company 1 Guards in a museum Hard F, G 2 Bomberman H ...
- Docker - 在CentOS7中安装Docker
在CentOS 7中安装Docker 1-确认系统信息 # cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) # uname - ...
- Docker 容器资源隔离 namespace(十)
目录 一.简介 Linux Namespace的6大类型 二.Mount Namespace 三.IPC Namespace 四.Network Namespace 五.UTS Namespace 六 ...
- Direct2D 学习笔记(2)画刷 Brush
画刷的使用方法 需要包含的文件:<wincodec.h> 需要包含的库: "windowscodecs.lib" 资源网址: https://docs.micro ...
- 使用Vue-Router的导航守卫-无限循环问题
我在项目里面用到了的是全局守卫,beforeEach,方便管理 不过遇到了一个问题,就是在beforeEach()中设置好判断条件后出现了无限循环的问题 当时的代码如下: router.beforeE ...
- layui监听复选按钮点击
layui.form.on('checkbox(resultQuery)', function(data){ console.log(data.elem); //得到checkbox原始DOM对象 c ...
- 离线安装docker,并导入docker镜像
将docker离线安装包导入到系统中,解压并进入文件夹,使用下述命令进行安装: rpm -ivh *.rpm --nodeps --force 安装完成功使用,docker info 查看docker ...
- shell 批量重命名
原文链接https://www.cnblogs.com/sunmmi/articles/6709125.html shell 批量重命名 1.把文件名的第一字母批量改成a 方法一: 1 2 3 4 ...
- 【51nod】2622 围绕着我们的圆环
[51nod] 2622 围绕着我们的圆环 kcz出的一道比赛题 第一次写带修改的线性基 ps:我觉得我计数计的好麻烦 首先是这个可以认为第二个矩阵是\(q\)个\(s\)位数,如果这\(q\)个数的 ...
- Redis 常用命令学习三:哈希类型命令
1.赋值与取值命令 127.0.0.1:6379> hset stu name qiao (integer) 1 127.0.0.1:6379> hset stu sex man (int ...