首页 > 其他分享 >19 迭代器模式 -- go语言设计模式

19 迭代器模式 -- go语言设计模式

时间:2023-08-27 21:31:34浏览次数:39  
标签:index aggregate iterator item 19 -- interface 设计模式

迭代器模式是一种行为型设计模式,它允许我们在不暴露聚合对象内部结构的情况下,遍历其中的元素。在这种模式下,我们使用迭代器对象来遍历聚合对象中的元素。

迭代器模式的实现代码

package main

import (
    "fmt"
)
// 定义一个迭代器接口
type Iterator interface {
    HasNext() bool
    Next() interface{}
}

// 定义一个具体的迭代器结构体
type ConcreteIterator struct {
    aggregate *ConcreteAggregate
    index     int
}

func (i *ConcreteIterator) HasNext() bool {
    return i.index < len(i.aggregate.items)
}

func (i *ConcreteIterator) Next() interface{} {
    if i.HasNext() {
        item := i.aggregate.items[i.index]
        i.index++
        return item
    }
    return nil
}

// 定义一个聚合对象接口
type Aggregate interface {
    CreateIterator() Iterator
    GetItem(index int) interface{}
}

// 定义一个具体的聚合对象结构体
type ConcreteAggregate struct {
    items []interface{}
}

func (a *ConcreteAggregate) CreateIterator() Iterator {
    return &ConcreteIterator{aggregate: a}
}

func (a *ConcreteAggregate) GetItem(index int) interface{} {
    return a.items[index]
}

func (a *ConcreteAggregate) AddItem(item interface{}) {
    a.items = append(a.items, item)
}

// 客户端
func main() {
    aggregate := &ConcreteAggregate{}
    aggregate.AddItem("Item 1")
    aggregate.AddItem("Item 2")
    aggregate.AddItem("Item 3")

    iterator := aggregate.CreateIterator()
    for iterator.HasNext() {
        item := iterator.Next()
        fmt.Println(item)
    }
}

终端输出

1.png

迭代器模式的代码拆分

1.项目的准备工作

找到 go 的 GOPATH

$ go env		//可以查看 GOPATH

在 GOPATH 目录下创建3个文件夹

1.bin文件夹		-- 存放编译后的二进制文件

2.pkg文件夹		-- 存放编译后的库文件

3.src文件夹		-- 存放源码文件

2.创建文件夹

//	-- 在项目文件夹 iterator_case 里创建新文件夹

//	iterator	-- 存放装饰者的全部文件

2.png

3.接口文件 -- iterator文件夹

文件1 -- iterator.go

package iterator

// 定义一个迭代器接口
type Iterator interface {
    HasNext() bool
    Next() interface{}
}

文件2 -- aggregate.go

package iterator

// 定义一个聚合对象接口
type Aggregate interface {
    CreateIterator() Iterator
    GetItem(index int) interface{}
}

4.结构体文件 -- iterator文件夹

文件1 -- concreteiterator.go

package iterator

// 定义一个具体的迭代器结构体
type ConcreteIterator struct {
    aggregate *ConcreteAggregate
    index     int
}

func (i *ConcreteIterator) HasNext() bool {
    return i.index < len(i.aggregate.items)
}

func (i *ConcreteIterator) Next() interface{} {
    if i.HasNext() {
        item := i.aggregate.items[i.index]
        i.index++
        return item
    }
    return nil
}

文件2 -- concreteaggregate.go

package iterator

// 定义一个具体的聚合对象结构体
type ConcreteAggregate struct {
    items []interface{}
}

func (a *ConcreteAggregate) CreateIterator() Iterator {
    return &ConcreteIterator{aggregate: a}
}

func (a *ConcreteAggregate) GetItem(index int) interface{} {
    return a.items[index]
}

func (a *ConcreteAggregate) AddItem(item interface{}) {
    a.items = append(a.items, item)
}

5.主文件 -- main.go 在项目文件夹

package main

import (
	"design/iterator_case/iterator"
	"fmt"
)

// 客户端
func main() {
    aggregate := &iterator.ConcreteAggregate{}
    aggregate.AddItem("Item 1")
    aggregate.AddItem("Item 2")
    aggregate.AddItem("Item 3")

    iterator := aggregate.CreateIterator()
    for iterator.HasNext() {
        item := iterator.Next()
        fmt.Println(item)
    }
}

终端输出

3.png

6.全部文件图

4.png

标签:index,aggregate,iterator,item,19,--,interface,设计模式
From: https://blog.51cto.com/u_14483476/7254835

相关文章

  • Doris启动BE时于是遇到的问题
    Doris启动BE时于是遇到的问题java.net.ConnectException:拒绝连接(Connectionrefused)配置文件中ip地址输入错误,导致无法访问,检查后修改即可sudovi/opt/module/apache-doris-0.15.0/be/conf/be.confBE启动后通过Mysql客户端查看状态时,alive=false,获取不到节点情况......
  • 第四节:分库分表深度剖析
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • 剑指Offer 32 - II. 从上到下打印二叉树 II
    题目链接:剑指Offer32-II.从上到下打印二叉树II题目描述:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。解法思路:本题与上题的唯一区别就是在输出的时候,要将同一层的数输出在一行,这就意味着你需要知道哪些数是在一行的;这里巧妙的利用求队列......
  • 【教程分享】Docker搭建Zipkin,实现数据持久化到MySQL、ES
    1拉取镜像指定版本,在git查看相应版本,参考:https://github.com/openzipkin/zipkin如2.21.7dockerpullopenzipkin/zipkin:2.21.72启动Zipkin默认端口为9411。启动时通过-eserver.port=xxxx设置指定端口dockerrun--namezipkin-server-d--restart=always-p9411:941......
  • python 中实现字符串反转的几种方法
     001、利用切片实现>>>str1="abcdef"##测试字符串>>>str1[::-1]'fedcba' 002、利用for循环实现>>>str1="abcdef"##测试字符串>>>rev="">>>foriinstr1:......
  • CentOS 清理系统磁盘空间
    CentOS清理系统磁盘空间一、为什么要深度清理CentOS系统磁盘空间随着CentOS系统的使用,磁盘空间的使用情况也会逐渐增加。当磁盘空间不足时,会影响系统的正常运行,因此需要定期清理磁盘空间。本文介绍了8个常见的命令和技巧,可用于清理CentOS系统磁盘空间。这些命令和......
  • 线性基与图论结合的经典问题
    立体传送门:LuoguP4151不急,一步一步来。第一种情况,考虑我们现在已经有一条\(1->n\)的路径,不妨设为\(1->i->j->k->n\),异或起来为\(dis_n\),那么我们的\(ans\)就是\(dis_n\)。第二种情况,在上种情况基础上,考虑这条路径上的\(i\)点有个环,不妨设这个环的异或起来为\(I\),那......
  • 3.14 + 1e10 - 1e10 = 0 ? ——浮点数的本质
    3.14+1e10-1e10=0?——浮点数的本质我们先看这样一个例子:#include<iostream>intmain(intargc,char**argv){floata=3.14;floatb=1e10;std::cout<<a<<""<<b<<std::endl;std::cout&l......
  • 关于本博客
    嘿呀!这里是黑鸦。本文是一些关于本博客的设定(?含有标签“校内模拟”的文章,为了保护水母中学的隐私,我将密码设为了那个白衣黑色双肩包男子的名字缩写。(然而这么多原题好像没啥保护的必要其实暂时也就这件事,以后或许会有更多。希望本博客能对你有所帮助。......
  • ubuntu15.04下用apache+iasp部署asp+mssqlserver运行环境
    最近由于工作需要,尝试了一下在linux下配置asp运行环境,耗时两周,在网上能找到的相关资料和软件都比较匮缺,特记录一下。一、硬件环境及操作系统windows2008+vm,win2008安装了sql2005作为数据库服务器,vm虚拟机安装ubuntu15.04用apache2.0.59+iasp2.1作为webserver二、ubuntu15.04安......