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 ...
随机推荐
- OO ALV事件里使用E消息,下一步会退出到系统初始界面
在OO ALV data_change事件时(选中行),锁定KEY值, 继续,取消选择,退出到系统初始界面 改成 pv_status = 'E'. pv_msg = '采购订单' && ...
- Tips for TMUX
常用命令 tmux ls # 显示后台session列表 tmux new -t [name] # 新建session tmux a -t [name] # 进入session tmux kill-s ...
- some code about numpy and notes about copy&broadcasting
import numpy as np np.__version__ #版本 #由于python的list不要求存储同样的类型,但是效率不高. L = [i for i in range(10)] L[ ...
- 【VS开发】Wix 安装教程
original link : http://www.cnblogs.com/stoneniqiu/p/3355086.html 因为项目需要,最近在研究Wix打包部署,园子里也有一些关于wix ...
- 【ARM-Linux开发】Rico Board DIY系列实验教程 Day 2——搭建Boa服务器
一:BOA WebServer简介 BOA WebServer是一款单任务的HTTP服务器,与其他网页服务器不同之处,是当有连接请求到来是,它既不是为每个连接都单独创建进程,也不是采用复制自身进程处理 ...
- Python创建文件报错OSError:[Errno 22] Invalid argument处理
问题: windows平台下使用python open函数w模式打开文件报错“OSError: [Errno 22] Invalid argument: '../news/“消费升维”成零售业新风口? ...
- Asp.Net Core 自定义验证属性
很多时候,在模型上的验证需要自己定义一些特定于我们需求的验证属性.所以这一篇我们就来介绍一下怎么自定义验证属性. 我们来实现一个验证邮箱域名的自定义验证属性,当然,最重要的是需要定义一个继承自Vali ...
- 【C++札记】构造函数与析构函数
构造函数(constructor) 1.构造函数是种特殊的类成员函数,遵循如下规则: a.函数名与类名必须相同. b.没有返回值 例如: class Obj { ... public: Obj() { ...
- k8s集群监控 cadvisor/exporter+prometheus+grafana
### k8s监控处理 ### 1.cadvisor/exporter+prometheus+grafana 安装#### 1.1 配置nfs安装```shellubuntu: nfs 服务器 apt ...
- pandas数据结构之Panel笔记
Panel创建的是三维的表 items:坐标轴0,索引对应的元素是一个DataFrame major_axis:坐标轴1,DataFrame里的行标签 minor_axis:坐标轴2,DataFram ...