基础编程学习快乐每一天
首页
留言
Siddim.com
当前位置:
首页
>
编程知识库
>
后端开发知识
>
设计模式是什么鬼(迭代器)
设计模式是什么鬼(迭代器)
阅读
1
2018-11-05
方法迭代,代的更迭,从初代到末代的遍历,指对某类集合中的每个元素按顺序取出的行为。举个例子,通常我们读小说是从前往后翻,一页接着一页地读,这样我们才可以了解一个连续完整的故事,那这就需要我们顺序地迭代整本书的每一页内容。
相信大家都用过集合类吧,最常用的比如
List
,
Set
,
Map
以及各种各样不同数据表示实现,总之是把某一批类似的元素按某种数据结构集合起来作为一个整体来引用,不至于元素丢的到处都是难以维护,当要用到每个元素的时候,我们需要将它们一个个的取出来,但是对不同的数据类型访问方式各有不同,于是我们就需要定义统一的迭代器来标准化这种遍历行为。
为何会有各种各样的遍历方式呢?比如说弹夹,装填子弹的时候要一颗一颗的进行压栈,等到射击的时候就需要迭代操作,先出栈拿出最后装填的子弹再进行射击,然后反向往前遍历直到最初装填的子弹直到射完为止,此刻也代表着迭代的结束,整个过程像是内存栈的操作,先进后出,后进先出,当然这并不代表其迭代器非要先进后出,这里只是举例说明针对不同数据类型进行不同的迭代方式。
以上数据结构及迭代器其实都有现成的类去实现,那么我们这里来自定义一种全新的数据结构,可以防止碰瓷!?牛吹得有点大了,我们就以行车记录仪举例,大家先想想怎么来记录一段一段的视频呢?如果我们简单的利用
ArrayList
去记录,那它得有多大空间去支持一直拍摄视频?
我们知道其实它是循环覆写的,待空间不够用时,最新的视频总会去覆盖掉最老的视频,以首尾相接的环形结构解决空间有限的问题。好,开始代码实战,首先我们定义一个行车记录仪类。
%
201public
%
20class
%
20DrivingRecorder
%
20
%
7B
%
0A
%
202
%
20
%
20
%
20
%
20private
%
20int
%
20index
%
20
=%
20
-
1
;//%
20
%
E5
%
BD
%
93
%
E5
%
89
%
8D
%
E8
%
AE
%
B0
%
E5
%
BD
%
95
%
E4
%
BD
%
8D
%
E7
%
BD
%
AE
%
0A
%
203
%
20
%
20
%
20
%
20private
%
20String
%
5B
%
5D
%
20records
%
20
=%
20new
%
20String
%
5B10
%
5D
;//%
20
%
E5
%
81
%
87
%
E8
%
AE
%
BE
%
E5
%
8F
%
AA
%
E8
%
83
%
BD
%
E8
%
AE
%
B0
%
E5
%
BD
%
9510
%
E6
%
9D
%
A1
%
E8
%
A7
%
86
%
E9
%
A2
%
91
%
0A
%
204
%
0A
%
205
%
20
%
20
%
20
%
20public
%
20void
%
20append
(
String
%
20record
)%
20
%
7B
%
0A
%
206
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20if
%
20
(
index
%
20
==%
209
)%
20
%
7B
//%
20
%
E5
%
BE
%
AA
%
E7
%
8E
%
AF
%
E8
%
A6
%
86
%
E7
%
9B
%
96
%
0A
%
207
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20index
%
20
=%
200
;%
0A
%
208
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
20else
%
20
%
7B
%
0A
%
209
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20index
;%
0A10
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
0A11
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20records
%
5Bindex
%
5D
%
20
=%
20record
;%
0A12
%
20
%
20
%
20
%
20
%
7D
%
0A13
%
0A14
%
20
%
20
%
20
%
20public
%
20void
%
20display
()%
20
%
7B
//%
20
%
E5
%
BE
%
AA
%
E7
%
8E
%
AF
%
E6
%
95
%
B0
%
E7
%
BB
%
84
%
E5
%
B9
%
B6
%
E6
%
98
%
BE
%
E7
%
A4
%
BA
%
E6
%
89
%
80
%
E6
%
9C
%
8910
%
E6
%
9D
%
A1
%
E8
%
AE
%
B0
%
E5
%
BD
%
95
%
0A15
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20for
%
20
(
int
%
20i
%
20
=%
200
;%
20i
%
20
&
lt
;%
2010
;%
20i
)%
20
%
7B
%
0A16
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20System
.
out
.
println
(
i
%
20
%
20
%
22
:%
20
%
22
%
20
%
20records
%
5Bi
%
5D
);%
0A17
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
0A18
%
20
%
20
%
20
%
20
%
7D
%
0A19
%
0A20
%
20
%
20
%
20
%
20public
%
20void
%
20displayInOrder
()%
20
%
7B
//%
E6
%
8C
%
89
%
E9
%
A1
%
BA
%
E5
%
BA
%
8F
%
E4
%
BB
%
8E
%
E6
%
96
%
B0
%
E5
%
88
%
B0
%
E6
%
97
%
A7
%
E6
%
98
%
BE
%
E7
%
A4
%
BA10
%
E6
%
9D
%
A1
%
E8
%
AE
%
B0
%
E5
%
BD
%
95
%
0A21
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20for
%
20
(
int
%
20i
%
20
=%
20index
,%
20loopCount
%
20
=%
200
;%
20loopCount
%
20
&
lt
;%
2010
;%
20i
%
20
=%
20i
%
20
==%
200
%
20
%
3F
%
20i
%
20
=%
209
%
20
:%
20i
%
20
-%
201
,%
20loopCount
)%
20
%
7B
%
0A22
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20System
.
out
.
println
(
records
%
5Bi
%
5D
);%
0A23
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
0A24
%
20
%
20
%
20
%
20
%
7D
%
0A25
%
7D
%
0A
假设我们的记录仪存储空间只够录
10
段视频,我们定义一个原始的字符串数组(第
3
行)来模拟记录,并且用一个游标(第
2
行)来记录当前记录所在位置。当插入视频的时候(第
5
行)我们得先看有没有录满到头了,如果是的话就要把游标调整到头以后再记录视频。视频目前可以循环记录了,但总得给用户显示出来看吧,于是我们又提供了两个显示方法,一个是按默认数组顺序显示,一个是按用户习惯从新到旧地显示内容(逻辑稍微复杂了点但这里不是重点,读者可以略过),开始写用户类来使用这个记录仪。
%
201public
%
20class
%
20Client
%
20
%
7B
%
0A
%
202
%
20
%
20
%
20
%
20public
%
20static
%
20void
%
20main
(
String
%
5B
%
5D
%
20args
)%
20
%
7B
%
0A
%
203
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20DrivingRecorder
%
20dr
%
20
=%
20new
%
20DrivingRecorder
();%
0A
%
204
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
//%
E5
%
81
%
87
%
E8
%
AE
%
BE
%
E8
%
AE
%
B0
%
E5
%
BD
%
95
%
E4
%
BA
%
8612
%
E6
%
9D
%
A1
%
E8
%
A7
%
86
%
E9
%
A2
%
91
%
0A
%
205
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20for
%
20
(
int
%
20i
%
20
=%
200
;%
20i
%
20
&
lt
;%
2012
;%
20i
)%
20
%
7B
%
0A
%
206
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20dr
.
append
(%
22
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_%
22
%
20
%
20i
);%
0A
%
207
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
0A
%
208
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20dr
.
display
();%
0A
%
209
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
/*%
E6
%
8C
%
89
%
E5
%
8E
%
9F
%
E5
%
A7
%
8B
%
E9
%
A1
%
BA
%
E5
%
BA
%
8F
%
E6
%
98
%
BE
%
E7
%
A4
%
BA
,%
E8
%
A7
%
86
%
E9
%
A2
%
910
%
E4
%
B8
%
8E1
%
E5
%
88
%
86
%
E5
%
88
%
AB
%
E8
%
A2
%
AB10
%
E4
%
B8
%
8E11
%
E8
%
A6
%
86
%
E7
%
9B
%
96
%
E4
%
BA
%
86
%
E3
%
80
%
82
%
0A10
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
200
:%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
10
%
0A11
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
201
:%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
11
%
0A12
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
202
:%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
2
%
0A13
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
203
:%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
3
%
0A14
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
204
:%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
4
%
0A15
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
205
:%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
5
%
0A16
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
206
:%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
6
%
0A17
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
207
:%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
7
%
0A18
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
208
:%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
8
%
0A19
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
209
:%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
9
%
0A20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
*/%
0A21
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20dr
.
displayInOrder
();%
0A22
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
/*%
E6
%
8C
%
89
%
E9
%
A1
%
BA
%
E5
%
BA
%
8F
%
E4
%
BB
%
8E
%
E6
%
96
%
B0
%
E5
%
88
%
B0
%
E6
%
97
%
A7
%
E6
%
98
%
BE
%
E7
%
A4
%
BA
%
0A23
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
11
%
0A24
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
10
%
0A25
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
9
%
0A26
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
8
%
0A27
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
7
%
0A28
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
6
%
0A29
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
5
%
0A30
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
4
%
0A31
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
3
%
0A32
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
2
%
0A33
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
*/%
0A34
%
20
%
20
%
20
%
20
%
7D
%
0A35
%
7D
%
0A
我们以视频_
0
开始,假设空间已经记录到视频_
11
,一共
12
条视频会不会撑爆空间呢?我们来运行以下看会发生什么。奇迹出现了,视频_
10
和视频_
11
分别覆盖了最早记录的视频_
0
和视频_
1
,完美!产品可以量产了!
正当我们要举杯欢庆的时候客户开始吐槽了,你只是简单在屏幕上显示一下就完事了么?功能也太差了点!我要的是把原始视频拿出来给我,我好上报交警作为证据,总之你甭管我怎么加工处理,你总得把原始数据拿出来给我。
这可把我们难住了,这些数据都是在记录仪内部封装好的私有数据,如果直接改成
public
暴露出去,试想用户随意增加删除,完全不管游标位置,这会破坏掉内部逻辑机制,数据封装的意义何在?我们鬼斧神工设计将瞬间崩塌,用户数据安全无法保证,
bug
肆虐。
所以,我们绝不能更改数据的私有化封装,而之前暴露给用户的显示方法显得非常死板,扩展性极差,我们决定以迭代器取而代之,如此提供给用户遍历数据的功能,拿出去的数据用户便可以随意使用,这样就避免了用户染指内部机件的危险。首先我们需要定义一个迭代器接口标准来规范抽象,看代码。
1public
%
20interface
%
20Iterator
&
lt
;
E
&
gt
;%
20
%
7B
%
0A2
%
20
%
20
%
20
%
20E
%
20next
();//%
E8
%
BF
%
94
%
E5
%
9B
%
9E
%
E4
%
B8
%
8B
%
E4
%
B8
%
80
%
E4
%
B8
%
AA
%
E5
%
85
%
83
%
E7
%
B4
%
A0
%
0A3
%
0A4
%
20
%
20
%
20
%
20boolean
%
20hasNext
();//%
E6
%
98
%
AF
%
E5
%
90
%
A6
%
E8
%
BF
%
98
%
E6
%
9C
%
89
%
E4
%
B8
%
8B
%
E4
%
B8
%
80
%
E4
%
B8
%
AA
%
E5
%
85
%
83
%
E7
%
B4
%
A0
%
0A5
%
7D
%
0A
很简单吧?此接口标准定义了两个方法,
next
方法用于返回下一个数据元素,而
hasNext
用于询问迭代器是否还有下一个元素,当然我们也可以不定义这个接口,而是直接用
JDK
中
util
包自带的。接下来更改我们的行车记录仪,加入
iterator
方法用于获取迭代器,开始我们的迭代器实现。
%
201public
%
20class
%
20DrivingRecorder
%
20
%
7B
%
0A
%
202
%
20
%
20
%
20
%
20private
%
20int
%
20index
%
20
=%
20
-
1
;//%
20
%
E5
%
BD
%
93
%
E5
%
89
%
8D
%
E8
%
AE
%
B0
%
E5
%
BD
%
95
%
E4
%
BD
%
8D
%
E7
%
BD
%
AE
%
0A
%
203
%
20
%
20
%
20
%
20private
%
20String
%
5B
%
5D
%
20records
%
20
=%
20new
%
20String
%
5B10
%
5D
;//%
20
%
E5
%
81
%
87
%
E8
%
AE
%
BE
%
E5
%
8F
%
AA
%
E8
%
83
%
BD
%
E8
%
AE
%
B0
%
E5
%
BD
%
9510
%
E6
%
9D
%
A1
%
E8
%
A7
%
86
%
E9
%
A2
%
91
%
0A
%
204
%
0A
%
205
%
20
%
20
%
20
%
20public
%
20void
%
20append
(
String
%
20record
)%
20
%
7B
%
0A
%
206
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20if
%
20
(
index
%
20
==%
209
)%
20
%
7B
//%
20
%
E5
%
BE
%
AA
%
E7
%
8E
%
AF
%
E8
%
A6
%
86
%
E7
%
9B
%
96
%
0A
%
207
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20index
%
20
=%
200
;%
0A
%
208
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
20else
%
20
%
7B
%
0A
%
209
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20index
;%
0A10
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
0A11
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20records
%
5Bindex
%
5D
%
20
=%
20record
;%
0A12
%
20
%
20
%
20
%
20
%
7D
%
0A13
%
0A14
%
20
%
20
%
20
%
20public
%
20Iterator
&
lt
;
String
&
gt
;%
20iterator
()%
20
%
7B
%
0A15
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20return
%
20new
%
20Itr
();%
0A16
%
20
%
20
%
20
%
20
%
7D
%
0A17
%
0A18
%
20
%
20
%
20
%
20private
%
20class
%
20Itr
%
20implements
%
20Iterator
&
lt
;
String
&
gt
;%
20
%
7B
%
0A19
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20int
%
20cursor
%
20
=%
20index
;//%
20
%
E8
%
BF
%
AD
%
E4
%
BB
%
A3
%
E5
%
99
%
A8
%
E6
%
B8
%
B8
%
E6
%
A0
%
87
%
EF
%
BC
%
8C
%
E4
%
B8
%
8D
%
E6
%
9F
%
93
%
E6
%
8C
%
87
%
E5
%
8E
%
9F
%
E5
%
A7
%
8B
%
E6
%
B8
%
B8
%
E6
%
A0
%
87
%
E3
%
80
%
82
%
0A20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20int
%
20loopCount
%
20
=%
200
;%
0A21
%
0A22
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
@
Override
%
0A23
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20public
%
20boolean
%
20hasNext
()%
20
%
7B
%
0A24
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20return
%
20loopCount
%
20
&
lt
;%
2010
;%
0A25
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
0A26
%
0A27
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
@
Override
%
0A28
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20public
%
20String
%
20next
()%
20
%
7B
%
0A29
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20int
%
20i
%
20
=%
20cursor
;//%
20
%
E8
%
AE
%
B0
%
E5
%
BD
%
95
%
E5
%
8D
%
B3
%
E5
%
B0
%
86
%
E8
%
BF
%
94
%
E5
%
9B
%
9E
%
E7
%
9A
%
84
%
E6
%
B8
%
B8
%
E6
%
A0
%
87
%
E4
%
BD
%
8D
%
E7
%
BD
%
AE
%
0A30
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20if
%
20
(
cursor
%
20
==%
200
)%
20
%
7B
%
0A31
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20cursor
%
20
=%
209
;%
0A32
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
20else
%
20
%
7B
%
0A33
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20cursor
--;%
0A34
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
0A35
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20loopCount
;%
0A36
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20return
%
20records
%
5Bi
%
5D
;%
0A37
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
0A38
%
20
%
20
%
20
%
20
%
7D
;%
0A39
%
7D
%
0A
这里我们加入内部类(第
18
行)来定义迭代器实现,为的是能轻松访问到记录仪私有数据集。内部类实现了两个标配方法
hasNext
与
next
,内部逻辑看起来简单多了,大家可以自行理解,这里就不做讲解了。最后重点来了,用户可以进行如下操作了。
%
201public
%
20class
%
20Client
%
20
%
7B
%
0A
%
202
%
20
%
20
%
20
%
20public
%
20static
%
20void
%
20main
(
String
%
5B
%
5D
%
20args
)%
20
%
7B
%
0A
%
203
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20DrivingRecorder
%
20dr
%
20
=%
20new
%
20DrivingRecorder
();%
0A
%
204
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
//%
20
%
E5
%
81
%
87
%
E8
%
AE
%
BE
%
E8
%
AE
%
B0
%
E5
%
BD
%
95
%
E4
%
BA
%
8612
%
E6
%
9D
%
A1
%
E8
%
A7
%
86
%
E9
%
A2
%
91
%
0A
%
205
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20for
%
20
(
int
%
20i
%
20
=%
200
;%
20i
%
20
&
lt
;%
2012
;%
20i
)%
20
%
7B
%
0A
%
206
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20dr
.
append
(%
22
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_%
22
%
20
%
20i
);%
0A
%
207
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
0A
%
208
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
//%
E7
%
94
%
A8
%
E6
%
88
%
B7
%
E8
%
A6
%
81
%
E8
%
8E
%
B7
%
E5
%
8F
%
96
%
E4
%
BA
%
A4
%
E9
%
80
%
9A
%
E4
%
BA
%
8B
%
E6
%
95
%
85
%
E8
%
A7
%
86
%
E9
%
A2
%
91
%
EF
%
BC
%
8C
%
E5
%
AE
%
9A
%
E4
%
B9
%
89
%
E4
%
BA
%
8B
%
E6
%
95
%
85
%
E5
%
88
%
97
%
E8
%
A1
%
A8
%
E3
%
80
%
82
%
0A
%
209
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20List
&
lt
;
String
&
gt
;%
20accidents
%
20
=%
20new
%
20ArrayList
&
lt
;&
gt
;();%
0A10
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
//%
E7
%
94
%
A8
%
E6
%
88
%
B7
%
E6
%
8B
%
BF
%
E5
%
88
%
B0
%
E8
%
BF
%
AD
%
E4
%
BB
%
A3
%
E5
%
99
%
A8
%
0A11
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20Iterator
&
lt
;
String
&
gt
;%
20it
%
20
=%
20dr
.
iterator
();%
0A12
%
0A13
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20while
%
20
(
it
.
hasNext
())%
20
%
7B
//%
E5
%
A6
%
82
%
E6
%
9E
%
9C
%
E8
%
BF
%
98
%
E6
%
9C
%
89
%
E4
%
B8
%
8B
%
E4
%
B8
%
80
%
E6
%
9D
%
A1
%
E5
%
88
%
99
%
E7
%
BB
%
A7
%
E7
%
BB
%
AD
%
E8
%
BF
%
AD
%
E4
%
BB
%
A3
%
0A14
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20String
%
20video
%
20
=%
20it
.
next
();%
0A15
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20System
.
out
.
println
(
video
);%
0A16
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
//%
E7
%
94
%
A8
%
E6
%
88
%
B7
%
E7
%
BF
%
BB
%
E7
%
9C
%
8B
%
E8
%
A7
%
86
%
E9
%
A2
%
91
%
E5
%
8F
%
91
%
E7
%
8E
%
B010
%
E5
%
92
%
8C8
%
E5
%
8F
%
AF
%
E4
%
BD
%
9C
%
E4
%
B8
%
BA
%
E8
%
AF
%
81
%
E6
%
8D
%
AE
%
E3
%
80
%
82
%
0A17
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20if
(%
22
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
10
%
22
.
equals
(
video
)%
20
%
7C
%
7C
%
20
%
22
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
8
%
22
.
equals
(
video
))%
7B
%
0A18
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20accidents
.
add
(
video
);%
0A19
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
0A20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
7D
%
0A21
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
//%
E6
%
8B
%
BF
%
E5
%
88
%
B0
%
E4
%
B8
%
A4
%
E4
%
B8
%
AA
%
E8
%
A7
%
86
%
E9
%
A2
%
91
%
E9
%
9B
%
86accidents
%
E4
%
BA
%
A4
%
E7
%
BB
%
99
%
E4
%
BA
%
A4
%
E8
%
AD
%
A6
%
E6
%
9F
%
A5
%
E7
%
9C
%
8B
%
E3
%
80
%
82
%
0A22
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20System
.
out
.
println
(%
22
%
E4
%
BA
%
8B
%
E6
%
95
%
85
%
E8
%
AF
%
81
%
E6
%
8D
%
AE
%
EF
%
BC
%
9A
%
22
%
20
%
20accidents
);%
0A23
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
/*%
0A24
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
11
%
0A25
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
10
%
0A26
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
9
%
0A27
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
8
%
0A28
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
7
%
0A29
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
6
%
0A30
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
5
%
0A31
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
4
%
0A32
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
3
%
0A33
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
2
%
20
%
0A34
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
E4
%
BA
%
8B
%
E6
%
95
%
85
%
E8
%
AF
%
81
%
E6
%
8D
%
AE
%
EF
%
BC
%
9A
%
5B
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
10
,%
20
%
E8
%
A7
%
86
%
E9
%
A2
%
91
_
8
%
5D
%
0A35
%
20
%
20
%
20
%
20
%
20
%
20
%
20
%
20
*/%
0A36
%
20
%
20
%
20
%
20
%
7D
%
0A37
%
7D
%
0A
用户拿到迭代器进行遍历查看,注意第
18
行,用户将这
12
条视频中的
10
和
8
拿出来拷贝
U
盘并交给交警作为呈堂证供判对方碰瓷,以证明自己的清白。
当然,我们这里只是保持极简说明问题,读者可以自行重构代码,尤其是实现迭代器的
remove
方法非常重要(注意游标的调整),这样用户便可以删除数据了。
总之,对于任何的集合类,既要保证内部数据表示不暴露给外部以防搞乱内部机制,还要提供给用户遍历并访问到每个数据的权限,迭代器模式则成就了鱼与熊掌兼得的可能,它提供了所有集合对外开放的统一标准接口,内政容不得干涉,但是经济依旧要开放。
点击图片加入
Java
知音交流群
↓↓↓
看完本文有收获?请转发分享给更多人
以上数据来源于网络,如有侵权,请联系删除。
上一篇:
设计模式是什么鬼(备忘录)
下一篇:
面试官:你能简单说说 SpringMVC 的执行原理吗?
评论
(0)
提交
类别
基础编程学习
HTML
PHP
Python
编程知识库
后端开发知识
热门文章
Java并发中的同步容器与并发容器,你了解多少?
Innodb中的事务隔离级别和锁的关系,难倒一半面试者!
SpringBoot + minio实现分片上传、秒传、续传
面试官:你知道消息队列如何保证数据不丢失吗?
JAVA知识 Java8新特性
面试官:谈谈为什么要限流,有哪些限流方案?
说说动态代理与静态代理区别
面试官:思考Tomcat 类加载器为什么要违背双亲委派模型?
boot-admin 基于SpringBoot的后台权限管理系统,可作为脚手架,用于快速搭建项目
SpringBoot+Vue+App+硬件实现智能家居系统项目