- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
迭代器模式(Iterator Pattern),是一种结构型设计模式。给数据对象构建一套按顺序访问集合对象元素的方式,而不需要知道数据对象的底层表示.
迭代器模式是与集合共存的,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像Java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,就可以引入迭代器模式,给我们的容器实现一个迭代器.
。
。
。
。
。
。
// Iterator.java 迭代器抽象接口,提供next和hasNext方法 public interface Iterator { public boolean hasNext(); public Object next(); }
。
。
。
// ObjectIterator.java 对象迭代器,实现了抽象迭代器的方法,聚合了对象列表 public class ObjectIterator implements Iterator { private ObjectList objectList; int index; public ObjectIterator(ObjectList objectList) { this .objectList = objectList; } @Override public boolean hasNext() { if (index < objectList.size()) { return true ; } return false ; } @Override public Object next() { if ( this .hasNext()) { // 返回数据对象提供的get方法,每访问一次则增加下标 return objectList.get(index++ ); } return null ; } }
。
。
// Container.go 创建抽象容器接口,创建一个迭代器 public interface Container { public Iterator createIterator(); }
。
。
。
// ObjectList.java 对象列表,是一种数据容器,可以创建一个迭代器 public class ObjectList implements Container { private Object[] objects = { "Google", "Apple", "Amazon" }; @Override public Iterator createIterator() { System.out.println( this .getClass().getName() + "::createIterator() [获取迭代器 ObjectIterator]" ); // 把当前对象传给迭代器 return new ObjectIterator( this ); } public void setObjects(Object[] objects) { this .objects = objects; } public int size() { return objects.length; } public Object get( int index) { return objects[index]; } }
。
。
/* * 迭代器模式是给数据容器创建单独的迭代器,用来遍历里面的数据对象 * 数据容器和迭代器相互关联,外部通过迭代器来访问数据容器 * 通过这种方式由迭代器类来负责数据遍历,这样可以做到不暴露集合的内部结构 */ int i = 0 ; ObjectList objectList = new ObjectList(); objectList.setObjects( new String[] { "Thomas", "Merry", "Jack", "Tony", "Jerry", "Joey" }); // for循环迭代对象 for (Iterator iter = objectList.createIterator(); iter.hasNext();) { String name = (String) iter.next(); System.out.println( "objectList[" + i + "] = " + name); i ++ ; } // while循环迭代对象 Iterator iter2 = objectList.createIterator(); objectList.setObjects( new Integer[] { 3, 5, 7, 9, 11 }); while (iter2.hasNext()) { System.out.println(iter2.next()); }
。
。
。
// Iterator.go 迭代器抽象接口,提供next和hasNext方法 type Iterator interface { HasNext() bool Next() string }
。
。
。
// ObjectIterator.go 对象迭代器,实现了抽象迭代器的方法,聚合了对象列表 type ObjectIterator struct { // 迭代器索引 index int // 聚合了数据对象 objectList * ObjectList } func (o *ObjectIterator) HasNext() bool { if o.index < o.objectList.Size() { return true } return false } func (o *ObjectIterator) Next() string { if o.HasNext() { // 返回数据对象提供的get方法,每访问一次下标增加1位 item := o.objectList.Get(o.index) o.index += 1 return item } return "" }
。
。
。
// Container.go 创建抽象容器接口,创建一个迭代器 type Container interface { CreateIterator() Iterator }
。
。
。
// ObjectList.go 对象列表,是一种数据容器,可以创建一个迭代器 type ObjectList struct { // 内部的数据结构 objects [] string } func (o * ObjectList) CreateIterator() Iterator { fmt.Println( " ObjectList::CreateIterator() [获取迭代器 ObjectIterator] " ) // 创建迭代器实例,绑定新建当前对象 return & ObjectIterator{ objectList: o, } } func (o *ObjectList) SetObjects(objects [] string ) { o.objects = objects } func (o *ObjectList) GetObjects() [] string { return o.objects } func (o *ObjectList) Size() int { return len (o.objects) } func (o *ObjectList) Get(index int ) string { return o.objects[index] }
。
。
/* * 迭代器模式是给数据容器创建单独的迭代器,用来遍历里面的数据对象 * 数据容器和迭代器相互关联,外部通过迭代器来访问数据容器 * 通过这种方式由迭代器类来负责数据遍历,这样可以做到不暴露集合的内部结构 */ int i = 0 ; ObjectList objectList = new ObjectList(); objectList.setObjects( new String[] { " Thomas " , " Merry " , " Jack " , " Tony " , " Jerry " , " Joey " }); // for循环迭代对象 for (Iterator iter = objectList.createIterator(); iter.hasNext();) { String name = (String) iter.next(); System.out. println ( " objectList[ " + i + " ] = " + name); i ++ ; } // while循环迭代对象 Iterator iter2 = objectList.createIterator(); objectList.setObjects( new Integer[] { 3 , 5 , 7 , 9 , 11 }); while (iter2.hasNext()) { System.out. println (iter2.next()); }
。
。
#include <stdio.h> #include <stdlib.h> // 简单版C语言迭代器模式,自己构建List数据类型 // 数据结构,这里使用链表作为示例 struct List { char * data; struct List * next; }; // 迭代器结构体 struct Iterator { struct List * current; int (*has_next)( struct Iterator *); // 判断是否还有下一个元素 char *(*next)( struct Iterator *, char **); // 获取下一个元素 }; // 判断是否还有下一个元素 int has_next( struct Iterator * iter) { return iter->current != NULL; } // 获取下一个元素 char *next( struct Iterator *iter, char ** value) { if (iter->current == NULL) { return NULL; } *value = iter->current-> data; iter ->current = iter->current-> next; return * value; } // 初始化迭代器 void create_iterator( struct Iterator *iter, struct List * head) { iter ->current = head; iter ->has_next = & has_next; iter ->next = & next; } // 遍历链表 void iterate_list( struct List * head) { struct Iterator iter; char * value; create_iterator( & iter, head); while (iter.has_next(& iter)) { iter.next( &iter, & value); printf( " \r\n %s " , value); } printf( " \n " ); } int main() { printf( " test start:\r\n " ); // 构造一个链表 struct List *head = ( struct List *) malloc ( sizeof ( struct List)); head ->data = " Tom " ; head ->next = ( struct List *) malloc ( sizeof ( struct List)); head ->next->data = " Jerry " ; head ->next->next = ( struct List *) malloc ( sizeof ( struct List)); head ->next->next->data = " Max " ; head ->next->next->next = NULL; // 使用迭代器遍历链表 iterate_list(head); // 释放链表内存 while (head != NULL) { struct List *temp = head; head = head-> next; free (temp); } return 0 ; }
。
。
不同语言实现设计模式: https://github.com/microwind/design-pattern 。
最后此篇关于【迭代器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现的文章就讲到这里了,如果你想了解更多关于【迭代器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如何将多个 TS 文件合并为一个具有正确时间戳的 TS 文件?我可以将文件合并为一个,而无需接触数据。这将生成一个可播放的文件,但时间戳不正确,因此不会显示时间线(例如在 VLC 中)。因此,我需要重
有一个视频,其实是一个HLS流(TS文件的序列) 我想取出一个 TS block 并用另一个替换它。 另一个 block 将使用相同的 FFMPEG 编码设置进行编码。 如果你想知道我为什么需要这个:
这段代码取自https://en.cppreference.com/w/cpp/utility/variant/visit using var_t = std::variant; template s
我刚刚开始使用 ts-node。这是一个非常方便的工具。运行时间看起来很清晰。但它不适用于 CLI 解决方案。我无法将参数传递到编译的脚本中。 ts-node --preserve-symlinks
如果您愿意花 2 美分来解决调用另一个文件中定义的函数的问题,我将不胜感激。我阅读了 Typescript 的文档,其中建议设置一个接口(interface)或一个模块,然后引用它,但我收到了与下面相
我在努力 tsc ts/game.ts --out test.js --module amd 在我在 webstorm 中的 typescript 项目上,但是控制台没有显示任何错误,也没有输出 t
我已经意识到有一段时间了,一些 typescript 文件有一个 .d.ts 而其他的只有一个 .ts 扩展名。 它们代表什么?有什么区别? 最佳答案 这些是 declaration files ,或
是否有一种简单的方法可以将std::variant中包含的数据移动到std::variant中? 我想可以通过一个额外的类模板来切换Ts...中的所有类型,但是我想知道是否存在一种更优雅的就地方法。
我是 Angular 的新手,正在查看文档,但我想我也应该在这里问我的问题。 我正在导出一个越来越大的类,因此我想将其分成两个文件,并将 d1、d2、d3 等存储在一个单独的文件中,然后将它们导入到
无法通过指定 ts.t 找到条目(ts 是时间戳类型) 挖oplog,想搞清楚一秒钟有多少操作。 无法通过指定时间戳字段找到条目,其他字段可以。$在蒙戈外壳中: > db.oplog.rs.findO
这是我的 Angular5 项目结构。 tsconfig.app.json 和package.json 都包含这个部分 "include": [ "/src/main.ts",
我在 Angular 10 中有一个项目,遇到了奇怪的 TS (TSLint) 错误。在我使用 $localize 的任何地方的 Visual Studio Code 中,我都收到错误消息 Canno
所以我创建了一个快速服务器,它获取一个 mp3 文件(现在存储在本地,但稍后将从 mongo db 中获取)并使用 ffmpeg 制作 .m3u8 和 .ts 文件。文件成功发送到客户端,在客户端播放
我有一个 MY_FILE.ts像这样的文件: const someFunction = (param: MY_NAMESPACE.PARAM) : boolean => { // DO SOMETHI
我过去常常在运行前编译用 TS 编写的 e2e Protractor 测试,但现在我想出了如何在运行时编译 ts 文件——ts-node 似乎是一个很好的工具。正如许多文章所说,我在 Protract
我不熟悉 mod-rewrite,我找不到任何类似的问题或解决方案。 非常感谢... 模板: {query1}_{query2}.ts ts.php?v={query1}&seg={query2} 例
我有 firestore.service.ts,在一种方法中,我在 firebase 中创建和更新了一个集合……离开该方法后,我更改了集合的“id”,但我需要这个“id”是没有丢失,因为我需要它到下一
DefinitelyTyped 有许多库的类型定义,但当 Javascript 实现与 Typescript 分离时,我常常找不到使用它们的好方法,比如当库通过 a 将自己分配给窗口的属性时 标记,
我正在寻找一种在我发布到 NPM 时忽略项目中所有 .ts 文件的好方法,我可以通过将以下内容添加到我的 .npmignore 文件中来做到这一点: *.ts 但是等等......实际上我想在我的项目
我的 Yarn 工作区结构如下: /project package.json /packages /app package.json webpack.confi
我是一名优秀的程序员,十分优秀!