深入理解JavaScript系列(35):设计模式之迭代器模式详解
介绍
迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示。
迭代器的几个特点是:
1.访问一个聚合对象的内容而无需暴露它的内部表示。
2.为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
3.遍历的同时更改迭代器所在的集合结构可能会导致问题(比如C#的foreach里不允许修改item)。
正文
一般的迭代,我们至少要有2个方法,hasNext()和Next(),这样才做做到遍历所有对象,我们先给出一个例子:
var agg = (function () {
var index = 0,
data = [1, 2, 3, 4, 5],
length = data.length;
return {
next: function () {
var element;
if (!this.hasNext()) {
return null;
}
element = data[index];
index = index + 2;
return element;
},
hasNext: function () {
return index < length;
},
rewind: function () {
index = 0;
},
current: function () {
return data[index];
}
};
} ());
使用方法和平时C#里的方式是一样的:
// 迭代的结果是:1,3,5
while (agg.hasNext()) {
console.log(agg.next());
}
当然,你也可以通过额外的方法来重置数据,然后再继续其它操作:
// 重置
agg.rewind();
console.log(agg.current()); // 1
jQuery应用例子
jQuery里一个非常有名的迭代器就是$.each方法,通过each我们可以传入额外的function,然后来对所有的item项进行迭代操作,例如:
$.each(['dudu', 'dudu', '酸奶小妹', '那个MM'], function (index, value) {
console.log(index + ': ' + value);
});
//或者
$('li').each(function (index) {
console.log(index + ': ' + $(this).text());
});
总结
迭代器的使用场景是:对于集合内部结果常常变化各异,我们不想暴露其内部结构的话,但又响让客户代码透明底访问其中的元素,这种情况下我们可以使用迭代器模式。
相关推荐
-
Java使用设计模式中迭代器模式构建项目的代码结构示例
迭代器(Iterator)模式,又叫做游标(Cursor)模式.GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节. 迭代器模式由以下角色组成: 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口. 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置. 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口. 具体容器角色(Concre
-
轻松掌握Java迭代器模式
定义:用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 特点: 1.它支持以不同的方式遍历一个聚合对象. 2.迭代器简化了聚合类. 3.在同一个聚合上可以有多个遍历. 4.在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码. 企业级开发和常用框架中的应用:java集合都实现了迭代器 具体实例: public class Demo { public static void main(String[] args) { ActualContainer container =
-
C++设计模式编程中的迭代器模式应用解析
迭代器模式:提供一种方法顺序访问一个聚合对象中个各个元素,而不暴露该对像的内部表示. 迭代器模式应该是最为熟悉的模式了,最简单的证明就是我在实现组合模式.享元模式.观察者模式中就直接用到了 STL 提供的迭代器来遍历 Vector 或者 List数据结构. 迭代器模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个类中进行,这样就避免了暴露这个聚合对象的内部表示的可能. 模式的动机: (1)一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访
-
使用迭代器模式来进行Java的设计模式编程
定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节. 类型:行为类模式 类图: 如果要问java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式,先来看一段代码吧: public static void print(Collection coll){ Iterator it = coll.iterator(); while(it.hasNext()){ String str = (String)it.next(); System.out
-
iOS App设计模式开发中对迭代器模式的使用示例
何为迭代器模式? 迭代器提供了一种顺序访问集合对象中元素的方法,而无需暴漏结构的底层表示和细节.遍历集合中元素的职能从集合本身转移到迭代器对象.迭代器定义了一个用于访问集合元素并记录当前元素的接口.不同的迭代器可以执行不同的策略. 例子 说了这么多,下面给大家展示一下类关系图. 上图中Client的右边是迭代器,左边是具体迭代的类型,在迭代器内部对具体需要迭代的类型进行了引用,还算不难理解吧,呵呵.其实,看起来是为了对具体类型进行解耦.好啦,下面给出具体的代码实现,简单的模拟了迭代器模式. 注意
-
PHP设计模式之迭代器模式
在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素而又不暴露该对象的内部表示,这就是PHP迭代器模式的定义. 适用场景: 访问一个聚合对象的内容而无需暴露它的内部表示 支持对聚合对象的多种遍历 为遍历不同的聚合结构提供一个统一的接口 迭代器模式实例: <?php class ConcreteIterator implements Iterator{ private $position = 0; private $arr; function __construct(array $arr){
-
设计模式中的迭代器模式在Cocoa Touch框架中的使用
基本理解 迭代器模式(Iterrator):提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该元素的内部表示. 当你访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式. 你需要对聚集有多种方式遍历时,可以考虑用迭代器模式. 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据. 迭代器定义了一个用于访问集合元素并记录当前元素的接口. 不同的迭代器可以执行不同的迭代策略.
-
C++设计模式之迭代器模式
前言 又到年底了,时间真的过的好快啊.最近也非常感伤,总是怀念大学的日子,做梦的时候也常常梦到.梦到大学在电脑前傻傻的敲着键盘,写着代码,对付着数据结构与算法的作业:建立一个链表,遍历链表,打印链表.现在把那个时候声明的链表的头文件拿出来看看: 复制代码 代码如下: typedef struct tagNode { int value; tagNode *pPre; tagNode *pNext; }Node; class CList { public:
-
学习JavaScript设计模式之迭代器模式
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. JavaScript中的Array.prototype.forEach 一.jQuery中的迭代器 $.each([1, 2, 3], function(i, n) { console.log("当前下标为:"+ i + " 当前元素为:"+ n ); }); 二.实现自己的迭代器 var each = function(ary, callback) { for(var i
-
Python使用设计模式中的责任链模式与迭代器模式的示例
责任链模式 责任链模式:将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间的耦合关系. #encoding=utf-8 # #by panda #职责连模式 def printInfo(info): print unicode(info, 'utf-8').encode('gbk') #抽象职责类 class Manager(): successor = None name = '' def __init__(self, name):
随机推荐
- 在JavaScript的正则表达式中使用exec()方法
- PHP调用Mailgun发送邮件的方法
- php标签云的实现代码
- 解析php多线程下载远程多个文件
- C#中结构(struct)的部分初始化和完全初始化实例分析
- C#的内存回收代码
- 得到文本框选中的文字,动态插入文字的js代码
- firefox 扩展开发技巧
- 一个asp版XMLDOM操作类
- Replace关键字的妙用查询是否包含某个特定字符串
- master数据库损坏的解决办法有哪些
- javascript下过滤数组重复值的代码
- jQuery的deferred对象使用详解
- jQuery获取及设置表单input各种类型值的方法小结
- c++中的消息框messagebox()详细介绍及使用方法
- Javascript检查图片大小不要让大图片撑破页面
- JS 自定义函数缺省值的设置方法
- Java中字符串拼接的一些细节分析
- 可绑定域名的德国10GB免费PHP空间
- php绘图之在图片上写中文和英文的方法
其他
- vue elemenui 导入excel数据不兼容ie浏览器
- vue 怎么加echarts
- my.cnf没有执行权限
- python写APP
- vscode运行python调试单步执行是灰色
- springsccurity 整合jwt
- mysql安装教程8.0.29
- input 动态添加样式
- java 如何获取resource下得文件
- python 蓝牙广播包分析
- C#输入一个地名获取据具体街道
- jquery实现操作菜单
- maven profile dependency编译
- el-tree节点后加虚线
- c#像素小鸟碰撞事件
- QT中的lineEdit如何拖入文件路径
- Java 循环队列 实现数据循环覆盖
- C 采用顺序存储结构,实现队列的存储和基本操作的问题分析
- 如何在conda虚拟环境里面使用局部pip
- ctypes 如何 使用list 传出