美文网首页
迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)

作者: long弟弟 | 来源:发表于2022-09-20 00:09 被阅读0次

迭代器模式,游标(Cursor)

意图:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

为遍历不同的聚集结构提供如开始、下一个、是否结束、当前一项等统一接口。

迭代器模式.jpg

角色和职责

  1. Iterator 迭代器接口,迭代器
    迭代器定义访问和遍历元素的接口
    该接口必须定义实现迭代功能的最小定义方法集
    比如提供hasNext()和next()方法
  2. ConcreteIterator 具体迭代器,迭代器实现类
    具体迭代器实现迭代器接口,可以根据具体情况加以实现
    对该聚合遍历时跟踪当前位置
  3. Aggregate 聚合
    聚合定义创建相应迭代器对象的接口
  4. 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循环等。

优点

  1. 支持以不同的方式遍历一个聚合对象。
  2. 在同一个聚合上可以有多个遍历。

缺点

由于迭代器模式将存储数据和遍历数据的职责分离,增加新的迭代器类,类的个数成对儿增加,这在一定程度上增加了系统的复杂性。

相关文章

网友评论

      本文标题:迭代器模式(Iterator Pattern)

      本文链接:https://www.haomeiwen.com/subject/jnbwnrtx.html