ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式学习-使用go实现迭代器模式

2021-11-24 20:03:00  阅读:170  来源: 互联网

标签:遍历 return 迭代 模式 names go nr 设计模式


迭代器模式

定义

迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。

提供了一种方法顺序的访问一个聚合对象中的各个元素,而不是暴露该对象的内部表示。

这里的聚合对象也叫容器聚合对象,实质上及时包含一组对象的对象,例如数组、链表、树、图、跳表。迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。

一个通俗的总结对于迭代器模式:

流水线上坐一天,每个包裹扫一遍。

优点

迭代器相比于 for 循环的优点

1、迭代器模式封装集合内部的复杂数据结构,开发者不需要了解如何遍历,直接使用容器提供的迭代器即可;

2、迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一;

3、迭代器模式让添加新的遍历算法更加容易,更符合开闭原则。除此之外,因为迭代器都实现自相同的接口,在开发中,基于接口而非实现编程,替换迭代器也变得更加容易。

缺点

由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

适用范围

1、访问一个聚合对象的内容而无须暴露它的内部表示;

2、需要为聚合对象提供多种遍历方式;

3、为遍历不同的聚合结构提供一个统一的接口。

代码实现

使用迭代器输出切片中的名字集合

type Iterator interface {
	HasNext() bool
	Next() string
}

type names []string

func (na names) NewIterator() *NameRepository {
	return &NameRepository{
		index: 0,
		names: na,
	}
}

type NameRepository struct {
	index int
	names names
}

func (nr *NameRepository) HasNext() bool {
	if nr.index < len(nr.names) {
		return true
	}
	return false
}

func (nr *NameRepository) Next() string {
	if nr.HasNext() {
		name := nr.names[nr.index]
		nr.index++
		return name
	}

	return ""
}

测试代码

func TestIterator(t *testing.T) {
	names := names{
		"小明", "小豆", "小龙",
	}
	nameRepository := names.NewIterator()
	for nameRepository.HasNext() {
		t.Log(nameRepository.Next())
	}
}

参考

【文中代码】https://github.com/boilingfrog/design-pattern-learning/tree/master/迭代器模式
【大话设计模式】https://book.douban.com/subject/2334288/
【极客时间】https://time.geekbang.org/column/intro/100039001
【迭代器模式】https://boilingfrog.github.io/2021/11/24/使用go实现迭代器模式/

标签:遍历,return,迭代,模式,names,go,nr,设计模式
来源: https://www.cnblogs.com/ricklz/p/15599791.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有