迭代器模式是一种行为型设计模式,允许顺序访问一个集合对象中的元素,而无需暴露该对象的内部表示。通过使用迭代器,客户端可以在不需要了解集合内部结构的情况下访问集合中的元素。优点有1、分离遍历和集合:迭代器模式将遍历的逻辑和集合元素的结构分开,客户端只需要使用迭代器即可遍历数据。2、支持多种遍历方式:可以轻松地实现多种不同的遍历方式(如正向、反向遍历)。3、简化接口:提供统一的接口来遍历不同的集合,减少了客户端与集合的耦合。
package main
import "fmt"
// 定义一个迭代器接口
type Iterator interface {
Next() bool // 移动到下一个元素
Value() interface{} // 获取当前元素
}
// 定义一个聚合类接口
type Aggregate interface {
GetIterator() Iterator // 返回一个迭代器
}
// 定义一个具体聚合类
type ArrayList struct {
items []interface{}
}
// Add 方法用于添加元素
func (a *ArrayList) Add(item interface{}) {
a.items = append(a.items, item)
}
// GetIterator 方法返回一个具体迭代器
func (a *ArrayList) GetIterator() Iterator {
return &ArrayListIterator{list: a, index: 0}
}
// 定义具体迭代器
type ArrayListIterator struct {
list *ArrayList
index int
}
// Next 方法实现迭代器的逻辑
func (it *ArrayListIterator) Next() bool {
if it.index < len(it.list.items) {
it.index++
return true
}
return false
}
// Value 方法返回当前元素
func (it *ArrayListIterator) Value() interface{} {
if it.index == 0 || it.index > len(it.list.items) {
return nil
}
return it.list.items[it.index-1]
}
func main() {
// 创建一个聚合对象并添加元素
list := &ArrayList{}
list.Add("item1")
list.Add("item2")
list.Add("item3")
// 获取迭代器并遍历元素
iterator := list.GetIterator()
for iterator.Next() {
fmt.Println(iterator.Value())
}
}
package main
import "fmt"
// 定义一个迭代器接口
type Iterator interface {
Next() bool // 移动到下一个元素
Value() interface{} // 获取当前元素
}
// 定义一个聚合类接口
type Aggregate interface {
GetIterator() Iterator // 返回一个迭代器
}
// 定义一个具体聚合类
type ArrayList struct {
items []interface{}
}
// Add 方法用于添加元素
func (a *ArrayList) Add(item interface{}) {
a.items = append(a.items, item)
}
// GetIterator 方法返回一个具体迭代器
func (a *ArrayList) GetIterator() Iterator {
return &ArrayListIterator{list: a, index: 0}
}
// 定义具体迭代器
type ArrayListIterator struct {
list *ArrayList
index int
}
// Next 方法实现迭代器的逻辑
func (it *ArrayListIterator) Next() bool {
if it.index < len(it.list.items) {
it.index++
return true
}
return false
}
// Value 方法返回当前元素
func (it *ArrayListIterator) Value() interface{} {
if it.index == 0 || it.index > len(it.list.items) {
return nil
}
return it.list.items[it.index-1]
}
func main() {
// 创建一个聚合对象并添加元素
list := &ArrayList{}
list.Add("item1")
list.Add("item2")
list.Add("item3")
// 获取迭代器并遍历元素
iterator := list.GetIterator()
for iterator.Next() {
fmt.Println(iterator.Value())
}
}