服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS App设计模式开发中对迭代器模式的使用示例

iOS App设计模式开发中对迭代器模式的使用示例

2021-01-13 16:25Snow Liang IOS

这篇文章主要介绍了iOS App设计模式开发中对迭代器模式的使用示例,示例代码为传统的Objective-C,需要的朋友可以参考下

何为迭代器模式?

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

例子

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

iOS App设计模式开发中对迭代器模式的使用示例

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

延伸 · 阅读

精彩推荐
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01