迭代器模式,游标(Cursor)
意图:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
为遍历不同的聚集结构提供如开始、下一个、是否结束、当前一项等统一接口。

角色和职责
- Iterator 迭代器接口,迭代器
迭代器定义访问和遍历元素的接口
该接口必须定义实现迭代功能的最小定义方法集
比如提供hasNext()和next()方法 - ConcreteIterator 具体迭代器,迭代器实现类
具体迭代器实现迭代器接口,可以根据具体情况加以实现
对该聚合遍历时跟踪当前位置 - Aggregate 聚合
聚合定义创建相应迭代器对象的接口 - ConcreteAggregate 具体聚合
具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例
代码示例
#import <Foundation/Foundation.h>
typedef int Object;
#define SIZE 5
//抽象迭代器
@protocol MyIterator <NSObject>
- (void)first;
- (void)next;
- (BOOL)isDone;
- (Object)currentItem;
@end
//数组
@protocol Aggregate <NSObject>
- (Object)getItem:(NSInteger)index;
- (id<MyIterator>)createIterator;
- (NSInteger)getSize;
@end
//在迭代器中 持有一个集合的引用;所以通过迭代器可以访问集合
@interface ConcreteIterator : NSObject <MyIterator>
@property (nonatomic, strong) id<Aggregate> ag;
@property (nonatomic, assign) NSInteger index;
@end
@implementation ConcreteIterator
- (instancetype)initWithAggregate:(id<Aggregate>)ag {
if (self = [super init]) {
self.ag = ag;
self.index = 0;
}
return self;
}
- (void)first {
self.index = 0;//游标回到0位置
}
- (void)next {
if ([self.ag getSize] > self.index) {
self.index++;
}
}
- (BOOL)isDone {
return self.index == [self.ag getSize];
}
- (Object)currentItem {
return [self.ag getItem:self.index];
}
@end
//对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式。
@interface ConcreteAggregate : NSObject <Aggregate> {
@private
Object _object[SIZE];
}
@end
@implementation ConcreteAggregate
- (instancetype)init {
if (self = [super init]) {
for (int i = 0; i < SIZE; i++) {
_object[i] = i+1;
}
}
return self;
}
- (Object)getItem:(NSInteger)index {
return _object[index];
}
- (id<MyIterator>)createIterator {
//迭代器持有集合
return [[ConcreteIterator alloc] initWithAggregate:self];
}
- (NSInteger)getSize {
return SIZE;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
id<Aggregate> ag = [[ConcreteAggregate alloc] init];
id<MyIterator> it = [ag createIterator];
for (; ![it isDone]; [it next]) {
NSLog(@"%d", [it currentItem]);
}
}
return 0;
}
/*
1
2
3
4
5
*/
用处
迭代器模式用来遍历集合对象,很多编程语言都将迭代器作为一个基础类库,直接提供出来了。在平时开发中,特别是业务开发,我们直接使用即可,很少会自己去实现一个迭代器。
iOS中提供了多种遍历集合的方式,比如for循环、forin循环等。
优点
- 支持以不同的方式遍历一个聚合对象。
- 在同一个聚合上可以有多个遍历。
缺点
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的迭代器类,类的个数成对儿增加,这在一定程度上增加了系统的复杂性。
网友评论