何为迭代器模式?
迭代器提供了一种顺序访问集合对象中元素的方法,而无需暴漏结构的底层表示和细节。遍历集合中元素的职能从集合本身转移到迭代器对象。迭代器定义了一个用于访问集合元素并记录当前元素的接口。不同的迭代器可以执行不同的策略。
例子
说了这么多,下面给大家展示一下类关系图。
上图中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.需要提供一个统一的接口,用来遍历各种类型的组合对象。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。