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 ...
随机推荐
- PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)
1040 Longest Symmetric String (25 分) Given a string, you are supposed to output the length of the ...
- sublime Text3文件路径提示功能
1>启动sublime Text3编辑器: 2> 点开菜单“preferences”——“package control”: 3>在弹出的下拉框中选择“install package ...
- mysl创建用户+授权+增、删、改查
1.mysql的root用户无法给普通用户授权问题处理 update mysql.user set Grant_priv='Y' where User='root' and Host='%': flu ...
- 02.提交bug
写代码最烦的也就是修复bug了,虽然这个避无可避…………………… a. bug的严重级别设置 1级:影响主要流程 ->在bug 的影响下,主流程 测试无法向下进行 2级:影响核心功能 -> ...
- Vue Router路由管理器介绍
参考博客:https://www.cnblogs.com/avon/p/5943008.html 安装介绍:Vue Router 版本说明 对于 TypeScript 用户来说,vue-router@ ...
- bootstrapvalidator API 文档地址: http://bootstrapvalidator.votintsev.ru/api/
bootstrap验证插件 bootstrapvalidator 文档API 地址 (原始作者英文):http://bootstrapvalidator.votintsev.ru/api/ 具体使用( ...
- 《ucore lab1 exercise1》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:理解通过make生成执行文件的过程 列出本实验各练习中对应的OS原理的知识点,并说明本实验中的实现部分如何对应和体现了原理中的基本概念和关 ...
- oracle中row_number()的用法
公司系统升级的时候需要数据迁移,遇到一个问题:新表的数据结构和旧表异构,旧表是流水号,新表是联合主键(业务号码+业务号码序号) 最后发现用窗口函数 row_number() + partition b ...
- PAT甲级 散列题_C++题解
散列 PAT (Advanced Level) Practice 散列题 目录 <算法笔记> 重点摘要 1002 A+B for Polynomials (25) 1009 Product ...
- 经典排序算法及总结(python实现)
目录 1.排序的基本概念和分类 排序的稳定性: 内排序和外排序 影响内排序算法性能的三个因素: 根据排序过程中借助的主要操作,可把内排序分为: 按照算法复杂度可分为两类: 2.冒泡排序 BubbleS ...