GoLang设计模式10 - 迭代器模式(行为型)@
迭代器模式是一种行为型模式。在这种模式中,集合结构会提供一个迭代器。通过这个迭代器可以顺序遍历集合中的每个元素而不需要暴露其具体的实现。
下面是迭代器模式的一些具体实现:
- Iterator 接口: 这个接口会定义一些基础的操作函数,如
hasNext()或getNext()等。通过名称就可以看出,这些方法可以帮助我们执行遍历集合、重启迭代等操作。 - Collection 接口: 这个接口代表了要被遍历的集合。在这个接口里定义了一个
createIterator方法,该方法会返回一个Iterator的实例。 - Concrete Iterator:
Iterator接口的具体实现类。 - Concrete Collection:
Collection接口的具体实现类。
在golang当前的版本(1.16或更早)中是没有泛型的,所以一些特殊情况下还是需要会用到迭代器模式。
来看下类图:

下面是示例代码:
1 type iterator interface { 2 hasNext() bool 3 getNext() *user 4 } 5 6 type collection interface { 7 createIterator() iterator 8 } 9 10 type user struct { 11 name string 12 age int 13 } 14 15 type userIterator struct { 16 index int 17 users []*user 18 } 19 20 func (u *userIterator) hasNext() bool { 21 if u.index < len(u.users) { 22 return true 23 } 24 return false 25 } 26 27 func (u *userIterator) getNext() *user { 28 if u.hasNext() { 29 user := u.users[u.index] 30 u.index++ 31 return user 32 } 33 return nil 34 } 35 36 type userCollection struct { 37 users []*user 38 } 39 40 func (u *userCollection) createIterator() iterator { 41 return &userIterator{ 42 users: u.users, 43 } 44 } 45 46 func main() { 47 user1 := &user{ 48 name: "a", 49 age: 30, 50 } 51 user2 := &user{ 52 name: "b", 53 age: 20, 54 } 55 userCollection := &userCollection{ 56 users: []*user{user1, user2}, 57 } 58 iterator := userCollection.createIterator() 59 for iterator.hasNext() { 60 user := iterator.getNext() 61 fmt.Printf("User is %+v\n", user) 62 } 63 }
输出内容:
1 User is &{name:a age:30} 2 User is &{name:b age:20}
浙公网安备 33010602011771号