设计模式-迭代器

12/12/2022 Go行为型模式

iterator

# 什么是迭代器模式

迭代器模式是一种行为设计模式,让你能在不暴露集合底层结构(列表、栈、树等)的情况下遍历集合中的所有元素。

# 包含哪些角色

iterator

  • Iterator: 迭代器接口

    声明了遍历集合所需的操作

  • IterableCollection: 集合接口

    声明一个方法或多个方法来获取与集合兼容的迭代器。

  • ConcreteIterator: 具体迭代器

    实现遍历集合的一种特定算法,迭代器对象必须跟踪自身遍历进度。

  • ConcreteCollection: 具体集合

    会在客户端请求迭代器时返回一个特定的具体迭代器类实体。

# 代码示例

package iterator

type Aggregate interface {
	Iterator() Iterator
}

type Iterator interface {
	HasNext() bool
	Next() interface{}
}

type ConcreteIterator struct {
	numbers []string
	next    int
}

func (i *ConcreteIterator) HasNext() bool {
	return i.next < len(i.numbers)
}

func (i *ConcreteIterator) Next() interface{} {
	if i.HasNext() {
		numer := i.numbers[i.next]
		i.next += 1
		return numer
	}
	return nil
}

type ConcreteAggregate struct {
	Length int
}

func (a *ConcreteAggregate) Iterator() Iterator {
	return &ConcreteIterator{
		numbers: make([]string, a.Length),
		next:    0,
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

使用示例

package iterator

import "fmt"

func ExampleIterator() {
	var aggregate Aggregate
	aggregate = &ConcreteAggregate{Length: 10}
	iterator := aggregate.Iterator()
	i := 0
	for iterator.HasNext() {
		_ = iterator.Next()
		fmt.Println(i)
		i++
	}
	// Output:
	// 0
	// 1
	// 2
	// 3
	// 4
	// 5
	// 6
	// 7
	// 8
	// 9
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 总结

# 优点

  • 访问一个聚合对象的内容而无须暴露它的内部表示。
  • 遍历任务交由迭代器完成,这简化了聚合类。
  • 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
  • 增加新的聚合类和迭代器类都很方便,无须修改原有代码。
  • 封装性良好,为遍历不同的聚合结构提供一个统一的接口。

# 缺点

  • 增加了类的个数,这在一定程度上增加了系统的复杂性。
最近更新时间: 7/26/2023, 6:37:16 AM
什么鸟日子
蒙太奇