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}

 

posted @ 2023-04-21 11:25  格局打得开  阅读(62)  评论(0)    收藏  举报