行为设计模式——迭代器模式

迭代器(Iterator)模式是一种行为型模式。在这种模式中,集合结构会提供一个迭代器。通过这个迭代器可以顺序遍历集合中的每个元素而不需要暴露其具体的实现。

示例代码:

package main

import (
	"fmt"
)

// Iterator 接口: 这个接口会定义一些基础的操作函数,如hasNext()或getNext()等。通过名称就可以看出,这些方法可以帮助我们执行遍历集合、重启迭代等操作。
type Iterator interface {
	hasNext() bool
	getNext() *User
}

// Collection 接口: 这个接口代表了要被遍历的集合。在这个接口里定义了一个createIterator方法,该方法会返回一个Iterator的实例。
type Collection interface {
	createIterator() Iterator
}

// 用户
type User struct {
	name string
	age  int
}

// 用户迭代器,Iterator 接口具体实现
type UserIterator struct {
	index int
	users []*User
}

func (u *UserIterator) hasNext() bool {
	if u.index < len(u.users) {
		return true
	}
	return false
}

func (u *UserIterator) getNext() *User {
	if u.hasNext() {
		user := u.users[u.index]
		u.index++
		return user
	}
	return nil
}

// 用户集合,Collection 接口具体实现
type UserCollection struct {
	users []*User
}

func (u *UserCollection) createIterator() Iterator {
	return &UserIterator{
		users: u.users,
	}
}

func main() {
	user1 := &User{
		name: "a",
		age:  30,
	}
	user2 := &User{
		name: "b",
		age:  20,
	}
	// 用户集合
	userCollection := &UserCollection{
		users: []*User{user1, user2},
	}
	// 创建迭代器
	iterator := userCollection.createIterator()
	// 开始迭代
	for iterator.hasNext() {
		user := iterator.getNext()
		fmt.Printf("User is %+v\n", user)
	}

}

运行示例代码,输出结果:

User is &{name:a age:30}
User is &{name:b age:20}

也可以看看


全国大流量卡免费领

19元月租ㆍ超值优惠ㆍ长期套餐ㆍ免费包邮ㆍ官方正品