当前位置: 首页 > news >正文

Go和Java实现迭代器模式

Go和Java实现迭代器模式

1、迭代器模式

迭代器模式是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道

集合对象的底层表示。

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

  • 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。

  • 主要解决:不同的方式来遍历整个整合对象。

  • 何时使用:遍历一个聚合对象。

  • 如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。

  • 关键代码:定义接口:hasNext, next。

  • 应用实例:JAVA 中的 iterator。

  • 优点:1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多

    个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

  • 缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的

    个数成对增加,这在一定程度上增加了系统的复杂性。

  • 使用场景:1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。

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

  • 注意事项:迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露

    集合的内部结构,又可让外部代码透明地访问集合内部的数据。

  • 适用性:

    访问一个聚合对象的内容而无需暴露它的内部表示。

    支持对聚合对象的多种遍历。

    为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。

2、Go实现迭代器模式

package iterator// ========== Iterator ==========
type Iterator interface {Next() stringFirst()Last()HasNext() bool
}
package iterator// ========== IteratorImpl ==========
type IteratorImpl struct {List  []stringIndex int
}func (iteratorImpl *IteratorImpl) First() {iteratorImpl.Index = 0
}func (iteratorImpl *IteratorImpl) Last() {iteratorImpl.Index = len(iteratorImpl.List) - 1
}func (iteratorImpl *IteratorImpl) Next() string {obj := iteratorImpl.List[iteratorImpl.Index]iteratorImpl.Index++return obj
}func (iteratorImpl *IteratorImpl) HasNext() bool {return iteratorImpl.Index < len(iteratorImpl.List)
}
package iterator// ========== List ==========
type List interface {Iterator() IteratorGet(index int) stringGetSize() intAdd(str string)
}
package iterator// ========== ListImpl ==========
type ListImpl struct {Index intSize  intList  []string
}func NewList() List {return &ListImpl{Index: 0, Size: 0}
}func (listImpl *ListImpl) Iterator() Iterator {return &IteratorImpl{Index: 0, List: listImpl.List}
}func (listImpl *ListImpl) Get(index int) string {return listImpl.List[index]
}func (listImpl *ListImpl) GetSize() int {return len(listImpl.List)
}func (listImpl *ListImpl) Add(str string) {listImpl.List = append(listImpl.List, str)
}
package mainimport ("fmt". "proj/iterator"
)func main() {list := NewList()list.Add("a")list.Add("b")list.Add("c")// 第一种迭代方式iterator := list.Iterator()for iterator.HasNext() {fmt.Println(iterator.Next())}fmt.Println("=====")// 第二种迭代方式for i := 0; i < list.GetSize(); i++ {fmt.Println(list.Get(i))}fmt.Println("=====")// first()和last()设置第一个元素和最后一个元素firstIt := list.Iterator()firstIt.First()for firstIt.HasNext() {fmt.Println(firstIt.Next())}fmt.Println("=====")lastIt := list.Iterator()lastIt.Last()for lastIt.HasNext() {fmt.Println(lastIt.Next())}
}
# 程序输出
a
b
c
=====
a
b
c
=====
a
b
c
=====
c

3、Java实现迭代器模式

package com.iterator;// ========== Iterator ==========
public interface Iterator {Object next();void first();void last();boolean hasNext();
}
package com.iterator;// ========== IteratorImpl ==========
public class IteratorImpl implements Iterator {private List list;private int index;public IteratorImpl(List list){index = 0;this.list = list;}@Overridepublic void first() {index = 0;}@Overridepublic void last() {index = list.getSize() - 1;}@Overridepublic Object next() {Object obj = list.get(index);index++;return obj;}@Overridepublic boolean hasNext() {return index < list.getSize();}
}
package com.iterator;// ========== List ==========
public interface List {Iterator iterator();Object get(int index);int getSize();void add(Object obj);
}
package com.iterator;// ========== ListImpl ==========
public class ListImpl implements List  {private Object[] list;private int index;private int size;public ListImpl() {index = 0;size = 0;list = new Object[100];}@Overridepublic Iterator iterator() {return new IteratorImpl(this);}@Overridepublic Object get(int index) {return list[index];}@Overridepublic int getSize() {return this.size;}@Overridepublic void add(Object obj) {list[index++] = obj;size++;}
}
package com.iterator;public class Test {public static void main(String[] arg) {List list = new ListImpl();list.add("a");list.add("b");list.add("c");// 第一种迭代方式Iterator it = list.iterator();while (it.hasNext()){System.out.println(it.next());}System.out.println("=====");// 第二种迭代方式for (int i = 0; i < list.getSize(); i++) {System.out.println(list.get(i));}System.out.println("=====");// first()和last()设置第一个元素和最后一个元素Iterator firstIt = list.iterator();firstIt.first();while (firstIt.hasNext()){System.out.println(firstIt.next());}System.out.println("=====");Iterator lastIt = list.iterator();lastIt.last();while (lastIt.hasNext()){System.out.println(lastIt.next());}}
}
# 程序输出
a
b
c
=====
a
b
c
=====
a
b
c
=====
c
http://www.lryc.cn/news/167211.html

相关文章:

  • 如何在 Vue.js 和 Nuxt.js 之间做出选择?
  • (二十三)大数据实战——Flume数据采集之采集数据聚合案例实战
  • Linux: network: dhcp: mtu 这个里面也有关于网卡的MTU设置;
  • Android中使用图片水印,并且能够在线下载字体并应用于水印
  • HTTP文件服务
  • nginx配置获取客户端的真实ip
  • 1990-2022上市公司董监高学历工资特征信息数据/上市公司高管信息数据
  • Java程序连接 Mysql 超时问题 - 数据包过大,导致超时,# 配置网络超时时间 socketTimeout: 1800000
  • c++分层最短路(洛谷飞行路线)acwing版
  • Python bs4 BeautifulSoup库使用记录
  • Jmeter系列-插件安装(5)
  • spring aop源码解析
  • 使用Unity的Input.GetAxis(““)控制物体移动、旋转
  • 【CSS】画个三角形或圆形或环
  • AI项目六:基于YOLOV5的CPU版本部署openvino
  • 记录YDLidar驱动包交叉编译时出现的一点问题
  • 嵌入式学习笔记(32)S5PV210的向量中断控制器
  • linux下安装qt、qt触摸屏校准tslib
  • C++之unordered_map,unordered_set模拟实现
  • React Router,常用API有哪些?
  • JVM类加载和双亲委派机制
  • P-MVSNet ICCV-2019 学习笔记总结 译文 深度学习三维重建
  • vueshowpdf 移动端pdf文件预览
  • C#根据excel文件中的表头创建数据库表
  • js通过xpath定位元素并且操作元素以下拉框select为例
  • 数据类型
  • vue 模板应用
  • Golang教程与Gin教程合集,入门到实战
  • 国家网络安全周 | 天空卫士荣获“2023网络安全优秀创新成果大赛优胜奖”
  • Swift学习笔记一(Array篇)