当前位置:首页 > 通信资讯 > 正文

iOS开发设计模式(ios开发实例)

何为迭代器模式?

迭代器提供了一种顺序访问集合对象中元素的方法,而无需暴漏结构的底层表示和细节。遍历集合中元素的职能从集合本身转移到迭代器对象。迭代器定义了一个用于访问集合元素并记录当前元素的接口。不同的迭代器可以执行不同的策略。

例子

说了这么多,下面给大家展示一下类关系图。

iOS开发设计模式(ios开发实例)

上图中client的右边是迭代器,左边是具体迭代的类型,在迭代器内部对具体需要迭代的类型进行了引用,还算不难理解吧,呵呵。其实,看起来是为了对具体类型进行解耦。好啦,下面给出具体的代码实现,简单的模拟了迭代器模式。

注意:本文所有代码均在arc环境下编译通过。

iterator类接口

复制代码 代码如下:


#import <foundation/foundation.h>

@interface iterator:nsobject
-(id)first;
-(id)next;
-(bool)isdone;
-(id)currentitem;
@end


iterator类实现

复制代码 代码如下:


#import "iterator.h"

@implementation iterator

-(id)first{
return nil;
}
-(id)next{
return nil;
}
-(bool)isdone{
return no;
}
-(id)currentitem{
return nil;
}
@end


concreteiterator类接口

复制代码 代码如下:


#import "iterator.h"

@class concreteaggregate;
@interface concreteiterator :iterator{
concreteaggregate *myaggregate;
int current;
}
-(concreteiterator*)myinit:(concreteaggregate*)aggregate;
@end


concreteiterator类实现

复制代码 代码如下:


#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


aggregate类接口

复制代码 代码如下:


#import <foundation/foundation.h>

@class iterator;
@interface aggregate:nsobject
-(iterator*)createiterator;
@end


aggregate类实现

复制代码 代码如下:


#import "aggregate.h"
#import "iterator.h"

@implementation aggregate
-(iterator*)createiterator{
return [[iterator alloc]init];
}
@end


concreteaggregate类接口

复制代码 代码如下:


#import "aggregate.h"

@interface concreteaggregate:aggregate{
nsmutablearray *items;
}
-(int)getcount;
-(id)getobject:(int)index;
-(void)insertobject:(id)obj;
@end


concreteaggregate类实现

复制代码 代码如下:


#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


main方法调用

复制代码 代码如下:


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.需要提供一个统一的接口,用来遍历各种类型的组合对象。

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。