迭代器模式

6.1 模式动机

送代器模式用于使用相同方式送代不同类型集合或者隐藏集合类型的具体实现。

可以使用送代器模式使遍历同时应用送代策略,如请求新对象、过滤、处理对象等。

6.2 Go语言实现

iterator.go

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

iterator_test.go

  1. package iterator
  2. func ExampleIterator() {
  3. var aggregate Aggregate
  4. aggregate = NewNumbers(1, 10)
  5. IteratorPrint(aggregate.Iterator())
  6. // Output:
  7. // 1
  8. // 2
  9. // 3
  10. // 4
  11. // 5
  12. // 6
  13. // 7
  14. // 8
  15. // 9
  16. // 10
  17. }