1. design-patterns/

golang 迭代器模式讲解和代码示例

·188 字·1 分钟· loading
设计模式 设计模式 golang
demo007x
作者
demo007x
设计模式 - This article is part of a series.
Part : This Article

Go 迭代器模式讲解和代码示例
#

迭代器是一种行为设计模式, 让你能在不暴露复杂数据结构内部细节的情况下遍历其中所有的元素。

在迭代器的帮助下, 客户端可以用一个迭代器接口以相似的方式遍历不同集合中的元素。

示例
#

迭代器模式的主要思想是将集合背后的迭代逻辑提取至不同的、 名为迭代器的对象中。 此迭代器提供了一种泛型方法, 可用于在集合上进行迭代, 而又不受其类型影响。

collection.go: 集合
#

package main

type Collection interface {
	createIterator() Iterator
}

userCollection.go: 具体集合
#

package main

type UserCollection struct {
	users []*User
}

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

iterator.go: 迭代器
#

package main

type Iterator interface {
	hasNext() bool
	getNext() *User
}

userIterator.go: 具体迭代器
#

package main

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
}

user.go: 客户端代码
#

package main

type User struct {
	name string
	age  int
}

main.go: 客户端代码
#

package main

import "fmt"

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)
	}
}

output.txt: 执行结果
#

User is &{name:a age:30} 
User is &{name:b age:20} 
设计模式 - This article is part of a series.
Part : This Article

Related

golang 中介者模式讲解和代码示例
设计模式 设计模式 golang
中介者是一种行为设计模式, 让程序组件通过特殊的中介者对象进行间接沟通, 达到减少组件之间依赖关系的目的。中介者能使得程序更易于修改和扩展, 而且能更方便地对独立的组件进行复用, 因为它们不再依赖于很多其他的类。
golang 享元模式讲解和代码示例
设计模式 设计模式 golang
享元是一种结构型设计模式, 它允许你在消耗少量内存的情况下支持大量对象。模式通过共享多个对象的部分状态来实现上述功能。 换句话来说, 享元会将不同对象的相同数据进行缓存以节省内存。
golang 工厂方法模式讲解和代码示例
设计模式 设计模式 golang
工厂方法是一种创建型设计模式, 解决了在不指定具体类的情况下创建产品对象的问题。工厂方法定义了一个方法, 且必须使用该方法代替通过直接调用构造函数来创建对象 ( new操作符) 的方式。 子类可重写该方法来更改将被创建的对象所属类。