首页 > 其他分享 >迭代器模式

迭代器模式

时间:2023-09-16 20:55:06浏览次数:47  
标签:hasNext name 迭代 age 模式 User type users

迭代器能在不暴露复杂数据结构内部细节的情况下遍历其中所有的元素。

package main

import "fmt"

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

type Collection interface {
	createIterator() Iterator
}

type User struct {
	name string
	age  int
}

type UserCollection struct {
	users []*User
}

type UserIterator struct {
	index int
	users []*User
}

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

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

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

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}

参考资料

https://refactoringguru.cn/design-patterns/iterator/go/example

标签:hasNext,name,迭代,age,模式,User,type,users
From: https://www.cnblogs.com/WJQ2017/p/17707289.html

相关文章

  • 设计模式7大原则
    开闭原则对扩展开放,对修改关闭。依赖倒置原则面向接口编程。单一职责原则一个类、接口、方法只负责一项职责。接口隔离原则接口中方法尽量少。迪米特法则尽量降低类与类之间的耦合。里氏替换原则引用父类的地方能使用其子类。合成复用原则尽量使用合成/聚合的方式,不是使用继......
  • 【设计模式】模板方法模式Template Method:实现同一模板框架下的扩展
    (目录)模板方法模式的原理和代码实现都比较简单,也被广泛应用,但是因为使用继承机制,副作用往往盖过了主要作用,所以在使用时尤其要小心谨慎。原理模板方法模式原始定义是:在操作中定义算法的框架,将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某......
  • 【设计模式】访问者模式Visitor:实现对象级别的矩阵结构
    (目录)访问者模式:一个原理看似很简单,但是理解起来有一定难度,使用场景相对较少的行为型模式:它能将算法与其所作⽤的对象隔离开来假如有这样⼀位⾮常希望赢得新客户的资深保险代理⼈。他可以拜访街区中的每栋楼,尝试向每个路⼈推销保险。所以,根据⼤楼内组织类型的不同,他可......
  • 【设计模式】解释器模式Interpreter Pattern:实现自定义配置规则功能
    解释器模式使用频率不算高,**通常用来描述如何构建一个简单“语言”的语法解释器。**它只在一些非常特定的领域被用到,比如:编译器;规则引擎;正则表达式;SQL解析等。不过,了解它的实现原理,可以帮助思考如何通过更简洁的规则来表示复杂的逻辑。模式原理分析解释器模式的原始......
  • 使用设计模式改写if/else或switch/case语句
    在写代码的时候,经常会用到if/else语句或者switch/case语句。虽然很省事,但是没有体现到java的封装、继承、多态等特性。没有用到java的面向对象编程的精髓。比如这种if/else语句:Stringstr="菠萝";if("苹果".equals(str)){ System.out.println("又大又红的苹果");}else......
  • 分布式Broker模式介绍
    Broker模式定义了6类:Client,Server,Client_Proxy,Server_Proxy,Broker,Bridge。Server:责任:处理特定领域的问题,实现服务的细节,注册自己到Broker,处理请求并返回结果或异常。协作类:Server_Proxy,BrokerClient:Client是需要访问远程服务的应用程序,为此,Client发送请求到Broker,并从Broker上接收......
  • 看懂FTP的主动和被动模式
    主动模式FTP主动模式下,FTP客户端从任意的非特殊的端口(N>1023)连入到FTP服务器的命令端口--21端口。然后客户端在N+1(N+1>=1024)端口监听,并且通过N+1(N+1>=1024)端口发送命令给FTP服务器。服务器会反过来连接用户本地指定的数据端口,比如20端口。以服务器端防火墙为立足点,要支持......
  • 8.前端设计模式之混合模式
    MaxinPattern: Addfunctionalitytoobjectsorclasseswithoutinheritance在不使用的继承的情况下为对象或者类添加功能在JavaScript中混合也是通过原型链实现的。比如有个Dog类:classDog{constructor(name){this.name=name;}}现在我们希望为Dog类添加bark、......
  • 从DevOps实践落地的角度谈谈“流程”和“规范"的反模式
    最近在经历的一些事情,让我突发灵感,觉得要写点关于DevOps体系建设过程中的“流程规范”,记录下来。如何解读"流程规范"谈到DevOps落地,无一例外都会提“流程规范“,我想没有人会反对,甚至会”不放在眼里“,因为概念本身没有什么晦涩难懂。可是一到落地,好像就是另外一番场景,“一地鸡......
  • 在工作流引擎设计领域,是否自动计算未来的处理人的设计模式有哪些?
    概述流程的第一个节点发送下去的时候,就要把以后所有节点的处理人计算出来,能清楚的知道每个节点都是那些人处理.计算未来处理人包括抄送节点、与待办节点.默认的模式为:每个节点发送的时候即使计算,就是不计算未来处理人.流程设计特征.流程的所有节点的接受人不能是主管选择的,只能......