Go语言:玩玩迭代器

Iterator Pattern(迭代模式)

这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

迭代器模式属于行为型模式

参考来源与 《图解设计模式》
代码结构

在这里插入图片描述

场景

建立一个书架 放入书籍
使用书架迭代器遍历书籍

代码

Iterator

建立迭代接口

package codeInHere

//建立迭代接口
type  Iterator interface {
	HasNext() bool //
	Next() interface{}
}

aggregate

建立一个用于遍历集合的迭代器

package codeInHere
//建立一个用于便利集合的迭代器
type aggregate interface {
	Iterator() BookshelfIterator
}
Book

建立书籍结构体

package codeInHere
//建立书籍结构体
type Book struct {
	bookName string
}

func (b *Book) GetName() string{
	return b.bookName
}

func NewBook(name string) Book{
	return Book{bookName:name}
} 
BookShelf

建立书架结构体 实现迭代器接口

package codeInHere
// 建立书架结构体
type BookShelf struct {
	books []Book
	index int
}

func NewBookShelf(size int ) *BookShelf{

	return  &BookShelf{
		books: make([]Book,size,size*2),
		index: 0,
	}
}

func (b *BookShelf) AppendBook(book Book){
	b.books[b.index] = book
	b.index++
}

func (b *BookShelf) GetLength() int {
	return  len(b.books)
}

func (b *BookShelf) GetBook(index int) Book{
	return  b.books[index]
}
//实现迭代器接口
func (b *BookShelf) Iterator() Iterator{
	return  NewBookSherlIterator(b)
}
BookshelfIterator

创建书架迭代 实现迭代接口

package codeInHere

type  BookshelfIterator struct {
	bookshelf *BookShelf
	index int
}

func  NewBookSherlIterator(shelf *BookShelf) *BookshelfIterator {
	return &BookshelfIterator{
		bookshelf: shelf,
		index:     0,
	}
}
//实现迭代接口
func (b *BookshelfIterator) Next() (book interface{}){
	book = b.bookshelf.books[b.index]
	b.index++
	return
}
//实现迭代接口
func (b *BookshelfIterator) HasNext() bool{
	if b.index < b.bookshelf.GetLength(){
		return  true
	}
	return  false
}

测试代码

package main

import (
	"designPatterns/IteratorDemo/codeInHere"
	"fmt"
)

func main() {
	bookShelf := codeInHere.NewBookShelf(4)
	bookShelf.AppendBook(codeInHere.NewBook("原则"))
	bookShelf.AppendBook(codeInHere.NewBook("第二曲线"))
	bookShelf.AppendBook(codeInHere.NewBook("创业维艰"))
	bookShelf.AppendBook(codeInHere.NewBook("规模"))

	it := bookShelf.Iterator()
	for it.HasNext(){
		//类型断言
		tmp := it.Next().(codeInHere.Book)
		fmt.Println(tmp.GetName())
	}

}
// 输出:
// 原则
// 第二曲线
// 创业维艰
// 规模


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值