何为迭代器模式?
迭代器提供了一种顺序访问集合对象中元素的方法,而无需暴漏结构的底层表示和细节。遍历集合中元素的职能从集合本身转移到迭代器对象。迭代器定义了一个用于访问集合元素并记录当前元素的接口。不同的迭代器可以执行不同的策略。
例子
说了这么多,下面给大家展示一下类关系图。
上图中Client的右边是迭代器,左边是具体迭代的类型,在迭代器内部对具体需要迭代的类型进行了引用,还算不难理解吧,呵呵。其实,看起来是为了对具体类型进行解耦。好啦,下面给出具体的代码实现,简单的模拟了迭代器模式。
注意:本文所有代码均在ARC环境下编译通过。
Iterator类接口
#import <Foundation/Foundation.h>@interface Iterator:NSObject -(id)First; -(id)Next; -(BOOL)IsDone; -(id)CurrentItem; @end
#import "Iterator.h"@implementation Iterator
-(id)First{ return nil; } -(id)Next{ return nil; } -(BOOL)IsDone{ return NO; } -(id)CurrentItem{ return nil; } @end
#import "Iterator.h"@class ConcreteAggregate; @interface ConcreteIterator :Iterator{ ConcreteAggregate *myAggregate; int current; } -(ConcreteIterator*)MyInit:(ConcreteAggregate*)aggregate; @end
#import "ConcreteIterator.h" #import "ConcreteAggregate.h"@implementation ConcreteIterator
-(ConcreteIterator*)MyInit:(ConcreteAggregate*)aggregate{ myAggregate = aggregate; return self; } -(id)First{ return [myAggregate GetObject:0]; } -(id)Next{ current++; if(current< [myAggregate GetCount]) return [myAggregate GetObject:current]; else { return nil; } } -(BOOL)IsDone{ return current>= [myAggregate GetCount] ?YES:NO; } -(id)CurrentItem{ return [myAggregate GetObject:current]; } @end
#import <Foundation/Foundation.h>@class Iterator; @interface Aggregate:NSObject -(Iterator*)CreateIterator; @end
#import "Aggregate.h" #import "Iterator.h"@implementation Aggregate -(Iterator*)CreateIterator{ return [[Iterator alloc]init]; } @end
#import "Aggregate.h"@interface ConcreteAggregate:Aggregate{ NSMutableArray *items; } -(int)GetCount; -(id)GetObject:(int)index; -(void)InsertObject:(id)Obj; @end
#import "ConcreteAggregate.h" #import "Iterator.h"@implementation ConcreteAggregate
-(id)init{ if(self == [super init]){ items = [NSMutableArray new]; } return self; } -(Iterator*)CreateIterator{ return [[Iterator alloc]init]; } -(id)GetObject:(int)index{ return [items objectAtIndex:index]; } -(void)InsertObject:(id)Obj{ [items addObject:Obj]; } -(int)GetCount{ return [items count]; } @end
import <Foundation/Foundation.h> #import "ConcreteAggregate.h" #import "Iterator.h" #import "ConcreteIterator.h"int main (int argc, const char *argv[]) { @autoreleasepool { ConcreteAggregate *a = [[ConcreteAggregate alloc]init]; [a InsertObject:@"张三"]; [a InsertObject:@"李四"]; [a InsertObject:@"王二"]; [a InsertObject:@"麻子"]; NSLog(@"Count:%d", [a GetCount]); Iterator *i = [[ConcreteIterator alloc]MyInit:a]; while (![i IsDone]) { NSLog(@"%@,请买票",[i CurrentItem]); [i Next]; } } return 0; }
何时使用迭代器模式?
1.需要访问组合对象的内容,而又不暴漏其内部表示。
2.需要通过多种方式遍历组合对象。
3.需要提供一个统一的接口,用来遍历各种类型的组合对象。
介绍 迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示。 迭代器的几个特点是: 访问一个聚合对象的内容而无需暴露它的内部表示。 为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。 遍历的同时更改迭代器所在的集合结构可能会导致问题(比如C#的foreach里不允许修改item)。 正文 一般的迭代,我们至少要有2个方
迭代器(Iterator) Intent 提供一种顺序访问聚合对象元素的方法,并且不暴露聚合对象的内部表示。 Class Diagram Aggregate 是聚合类,其中 createIterator() 方法可以产生一个 Iterator; Iterator 主要定义了 hasNext() 和 next() 方法; Client 组合了 Aggregate,为了迭代遍历 Aggregate,也
本文向大家介绍Python使用设计模式中的责任链模式与迭代器模式的示例,包括了Python使用设计模式中的责任链模式与迭代器模式的示例的使用技巧和注意事项,需要的朋友参考一下 责任链模式 责任链模式:将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间的耦合关系。 类图: 迭代器模式 迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素
本文向大家介绍javascript设计模式之迭代器模式,包括了javascript设计模式之迭代器模式的使用技巧和注意事项,需要的朋友参考一下 迭代器模式分为内部迭代器和外部迭代器,内部迭代器就是在函数内部定义好迭代的规则,它完全接手整个迭代的过程,外部只需一次初始调用。 内部迭代器 以下自行实现的类似jquery中$.each()的each()函数就是内部迭代器 内部迭代器在调用时非常方便,但是
本文向大家介绍详解Java设计模式——迭代器模式,包括了详解Java设计模式——迭代器模式的使用技巧和注意事项,需要的朋友参考一下 迭代子模式 顾名思义,迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问。我们看下关系图: 这个思路和我们常用的一
本文向大家介绍Java使用设计模式中迭代器模式构建项目的代码结构示例,包括了Java使用设计模式中迭代器模式构建项目的代码结构示例的使用技巧和注意事项,需要的朋友参考一下 迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 迭代器模式由以下角色组成: 迭代器角色(Ite