File tree Expand file tree Collapse file tree 3 files changed +84
-0
lines changed Expand file tree Collapse file tree 3 files changed +84
-0
lines changed Original file line number Diff line number Diff line change
1
+ # 送代器模式
2
+
3
+ 送代器模式用于使用相同方式送代不同类型集合或者隐藏集合类型的具体实现。
4
+
5
+ 可以使用送代器模式使遍历同时应用送代策略,如请求新对象、过滤、处理对象等。
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments