Skip to content

Commit 9e704d1

Browse files
committed
add iterator
1 parent 23cb856 commit 9e704d1

File tree

3 files changed

+84
-0
lines changed

3 files changed

+84
-0
lines changed

12_iterator/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# 送代器模式
2+
3+
送代器模式用于使用相同方式送代不同类型集合或者隐藏集合类型的具体实现。
4+
5+
可以使用送代器模式使遍历同时应用送代策略,如请求新对象、过滤、处理对象等。

12_iterator/iterator.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package iterator
2+
3+
import "fmt"
4+
5+
type Aggregate interface {
6+
Iterator() Iterator
7+
}
8+
9+
type Iterator interface {
10+
First()
11+
IsDone() bool
12+
Next() interface{}
13+
}
14+
15+
type Numbers struct {
16+
start, end int
17+
}
18+
19+
func NewNumbers(start, end int) *Numbers {
20+
return &Numbers{
21+
start: start,
22+
end: end,
23+
}
24+
}
25+
26+
func (n *Numbers) Iterator() Iterator {
27+
return &NumbersIterator{
28+
numbers: n,
29+
next: n.start,
30+
}
31+
}
32+
33+
type NumbersIterator struct {
34+
numbers *Numbers
35+
next int
36+
}
37+
38+
func (i *NumbersIterator) First() {
39+
i.next = i.numbers.start
40+
}
41+
42+
func (i *NumbersIterator) IsDone() bool {
43+
return i.next > i.numbers.end
44+
}
45+
46+
func (i *NumbersIterator) Next() interface{} {
47+
if !i.IsDone() {
48+
next := i.next
49+
i.next++
50+
return next
51+
}
52+
return nil
53+
}
54+
55+
func IteratorPrint(i Iterator) {
56+
for i.First(); !i.IsDone(); {
57+
c := i.Next()
58+
fmt.Printf("%#v\n", c)
59+
}
60+
}

12_iterator/iterator_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package iterator
2+
3+
func ExampleIterator() {
4+
var aggregate Aggregate
5+
aggregate = NewNumbers(1, 10)
6+
7+
IteratorPrint(aggregate.Iterator())
8+
// Output:
9+
// 1
10+
// 2
11+
// 3
12+
// 4
13+
// 5
14+
// 6
15+
// 7
16+
// 8
17+
// 9
18+
// 10
19+
}

0 commit comments

Comments
 (0)