迭代器模式

定义

提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示

场景

需要实现自己的容器类,且要迭代里面的元素

实现

IOS中有现成的迭代的接口NSEnumerator,直接使用而不需要重新创建。
1、UML图


迭代器.png

2、使用

  • 创建原始对象类
@interface Student : NSObject
@property(nonatomic, copy)NSString *name;
-(instancetype)initWithName:(NSString *)name;
@end
#import "Student.h"

@implementation Student
- (instancetype)initWithName:(NSString *)name
{
    self = [super init];
    if (self) {
        self.name = name;
    }
    return self;
}
@end
  • 创建容器类
#import <Foundation/Foundation.h>
#import "Student.h"
NS_ASSUME_NONNULL_BEGIN

@interface Grade : NSObject
-(void)addStudent:(Student *)student;
-(void)removeStudent:(Student *)student;
-(NSEnumerator<Student*>*)objectEnumerator;
@end

NS_ASSUME_NONNULL_END
#import "Grade.h"
#import "GradeEnumerator.h"
@interface Grade()
@property(nonatomic, strong)NSMutableArray *array;
@end
@implementation Grade
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.array = [[NSMutableArray alloc] init];
    }
    return self;
}

- (void)addStudent:(Student *)student{
    [self.array addObject:student];
}

- (void)removeStudent:(Student *)student{
    for(Student *stu in self.array){
        if([stu.name isEqualToString:student.name]){
            [self.array removeObject:stu];
            break;
        }
    }
}

- (NSEnumerator<Student *> *)objectEnumerator{
    return [[GradeEnumerator alloc] initGradeWithStudents:self.array];
}
@end
  • 创建迭代器类
@interface GradeEnumerator : NSEnumerator<Student*>
-(instancetype)initGradeWithStudents:(NSArray<Student*>*)array;
@end
#import "GradeEnumerator.h"
@interface GradeEnumerator()
@property(nonatomic, strong)NSArray<Student*> *array;
@property(nonatomic, assign)int index;
@end
@implementation GradeEnumerator
- (instancetype)initGradeWithStudents:(NSArray<Student *> *)array{
    self = [super init];
    if (self) {
        self.array = array;
        self.index = 0;
    }
    return self;
}
- (Student *)nextObject{
    Student *value = nil;
    if(self.index < self.array.count){
        value = self.array[self.index];
        self.index ++;
    }
    return value;
}
@end
  • Client调用
    Student *bob = [[Student alloc] initWithName:@"bob"];
    Student *lily = [[Student alloc] initWithName:@"lily"];
    Grade *grade = [[Grade alloc] init];
    [grade addStudent:bob];
    [grade addStudent:lily];
    
    //遍历
    Student *student;
    NSEnumerator *enumerator = [grade objectEnumerator];
    while (student = [enumerator nextObject]) {
        NSLog(@"student name:%@", student.name);
    }

总结

类要支持迭代,而又不暴露其内部接口,可使用该模式。

代码

链接: https://pan.baidu.com/s/1h79yRgiluYgJPqvmWqTDWA 提取码: fr3t

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容