迭代器模式

基本理解

  • 迭代器模式(Iterrator):提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该元素的内部表示。
  • 当你访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。
  • 你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。
  • 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
  • 迭代器定义了一个用于访问集合元素并记录当前元素的接口。
  • 不同的迭代器可以执行不同的迭代策略。
  • 外部迭代器和内部迭代器
    • 外部迭代器
    • 外部迭代器让客户端直接操作迭代过程,所以客户端需要知道外部迭代器才能使用。但是它为客户端提供了更多的控制
    • 客户端创建并维护外部迭代器
    • 客户端可以使用不同外部迭代器实现多种类型的遍历
    • 内部迭代器
      • 客户端不需要知道任何外部迭代器,而是可以通过集合对象的特殊接口,或者一次访问一个元素,或者向集合中的每个元素发送消息。
      • 集合对象本身创建并维护它的外部迭代器
      • 集合对象可以在不修改客户端代码的情况下,选择不同的外部迭代器

何时使用迭代器

  • 需要访问组合对象的内容,而又不是暴露其内部标示
  • 需要通过多种方式遍历组合对象
  • 需要提供一个统一的接口,用来遍历各种类型的组合对象

在Cocoa Touch框架中使用迭代器模式

  • 苹果公司用自己命名规则“枚举器/枚举”改写了迭代器模式,用于相关基础类的各种方法。也就是说枚举就是苹果版本的迭代。

  • 基础框架中的NSEnumerator类实现了迭代器模式。抽象NSEnumerator类的私有具体子类返回枚举器对象,能够顺序遍历各种几何--数组、集(set)、字典(值与键),把集合的对象返回给客户端。

  • NSEnumerator可以枚举NSArray/NSDictionary和NSSet对象中的元素。它本身是个抽象类。它依靠几个工厂方法,如objectEnumerator或keyEnumerator,来创建并返回相应的具体枚举器对象。

  • 从iOS4开始,有了另一种枚举Cocoa Touch框架中集合对象的方法,叫做基于块的枚举。

  • 快速枚举,这个是苹果推荐的枚举方法。它允许把集合对象的枚举直接用作for循环的一部分,无需使用其他枚举器对象,而且比传统的基于索引的for循环效率更高,形如:

    1. NSArray *arr = @[@"zhangsan",@"lisi",@"wangwu"];
    2. for(NSString *item in arr)
    3. {
    4. NSLog(@"%@",item);
    5. }

例子

该例子定义了一个集合Set和一个迭代器ConcreteIterator。然后通过迭代器来输出集合Set对象的元素。

ConcreteSet.h

  1. //
  2. // ConcreteSet.h
  3. // IterationDemo
  4. //
  5. // Created by zhanggui on 15/8/8.
  6. // Copyright (c) 2015年 zhanggui. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. @interface ConcreteSet : NSObject
  10. {
  11. NSMutableArray *items;
  12. }
  13. -(NSInteger)getCount;
  14. -(id)getItemFromIndex:(NSInteger)index;
  15. -(void)insertItem:(id)item;
  16. @end

ConcreteSet.m

  1. //
  2. // ConcreteSet.m
  3. // IterationDemo
  4. //
  5. // Created by zhanggui on 15/8/8.
  6. // Copyright (c) 2015年 zhanggui. All rights reserved.
  7. //
  8. #import "ConcreteSet.h"
  9. #import "ConcreteIterator.h"
  10. @implementation ConcreteSet
  11. -(id)init
  12. {
  13. self = [super init];
  14. if (self) {
  15. items = [NSMutableArray new];
  16. }
  17. return self;
  18. }
  19. -(NSInteger)getCount
  20. {
  21. return [items count];
  22. }
  23. -(id)getItemFromIndex:(NSInteger)index
  24. {
  25. return [items objectAtIndex:index];
  26. }
  27. -(ConcreteIterator *)createiterator
  28. {
  29. return [ConcreteIterator new];
  30. }
  31. -(void)insertItem:(id)item
  32. {
  33. [items addObject:item];
  34. }
  35. @end

Concreteiterator.h

  1. //
  2. // ConcreteIterator.h
  3. // IterationDemo
  4. //
  5. // Created by zhanggui on 15/8/8.
  6. // Copyright (c) 2015年 zhanggui. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. @class ConcreteSet;
  10. @interface ConcreteIterator : NSObject
  11. {
  12. ConcreteSet *mySet;
  13. int current;
  14. }
  15. -(id)FirstItem;
  16. -(id)nextItem;
  17. -(BOOL)isFinish;
  18. -(id)currentItem;
  19. -(id)initWithConcreteSet:(ConcreteSet *)concrete;
  20. @end

Concreteiterator.m

  1. //
  2. // ConcreteIterator.m
  3. // IterationDemo
  4. //
  5. // Created by zhanggui on 15/8/8.
  6. // Copyright (c) 2015年 zhanggui. All rights reserved.
  7. //
  8. #import "ConcreteIterator.h"
  9. #import "ConcreteSet.h"
  10. @implementation ConcreteIterator
  11. -(id)initWithConcreteSet:(ConcreteSet *)concrete
  12. {
  13. self = [super init];
  14. if (self) {
  15. mySet = concrete;
  16. }
  17. return self;
  18. }
  19. -(id)FirstItem
  20. {
  21. return [mySet getItemFromIndex:0];
  22. }
  23. -(id)nextItem
  24. {
  25. current ++;
  26. if (current<[mySet getCount]) {
  27. return [mySet getItemFromIndex:current];
  28. }else
  29. {
  30. return nil;
  31. }
  32. }
  33. -(BOOL)isFinish
  34. {
  35. return current>=[mySet getCount] ? YES : NO;
  36. }
  37. -(id)currentItem
  38. {
  39. return [mySet getItemFromIndex:current];
  40. }
  41. @end

然后在ViewController中测试

  1. //
  2. // ViewController.m
  3. // IterationDemo
  4. //
  5. // Created by zhanggui on 15/8/8.
  6. // Copyright (c) 2015年 zhanggui. All rights reserved.
  7. //
  8. #import "ViewController.h"
  9. #import "ConcreteIterator.h"
  10. #import "ConcreteSet.h"
  11. @interface ViewController ()
  12. @end
  13. @implementation ViewController
  14. - (void)viewDidLoad {
  15. [super viewDidLoad];
  16. // NSArray *arr = @[@"apple",@"banana",@"orange"];
  17. //
  18. // for(NSString *item in arr)
  19. // {
  20. // NSLog(@"%@",item);
  21. // }
  22. ConcreteSet *set = [[ConcreteSet alloc] init];
  23. [set insertItem:@"apple"];
  24. [set insertItem:@"banana"];
  25. [set insertItem:@"orange"];
  26. NSLog(@"Count is :%ld",(long)[set getCount]);
  27. ConcreteIterator *iterator = [[ConcreteIterator alloc] initWithConcreteSet:set];
  28. while (![iterator isFinish]) {
  29. NSLog(@"%@",[iterator currentItem]);
  30. [iterator nextItem];
  31. }
  32. }
  33. @end

用自己定义的迭代器去输出元素和用苹果枚举效果类似。苹果推荐使用类似与viewDidLoad方法中的for循环来输出集合元素。

附:

iOS设计模式之迭代器模式的更多相关文章

  1. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  2. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  3. Python进阶:设计模式之迭代器模式

    在软件开发领域中,人们经常会用到这一个概念——“设计模式”(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础 ...

  4. 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)

    设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...

  5. js设计模式——4.迭代器模式

    js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...

  6. 实践GoF的设计模式:迭代器模式

    摘要:迭代器模式主要用在访问对象集合的场景,能够向客户端隐藏集合的实现细节. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:迭代器模式>,作者:元闰子. 简介 有时会遇到这 ...

  7. 【GOF23设计模式】迭代器模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 package com.test.iterator; /** * 自定义的迭代 ...

  8. [设计模式] 16 迭代器模式 Iterator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...

  9. php设计模式之迭代器模式

    今天的PHP设计模式系列的主角是迭代器(Iterator)模式,迭代器模式提供了抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代. 迭代器(Iterator)模式,它在一个很常见的过程上提供了 ...

随机推荐

  1. STL中vector小结

    ()使用vector之前必须包含头文件<vector>:#include<vector> ()namespace std{ template <class T, clas ...

  2. 说说你所熟知的MSSQL中的substring函数

    说说你所熟知的MSSQL中的substring函数 *:first-child { margin-top: 0 !important; } body>*:last-child { margin- ...

  3. linux下如何修改weblogic console登陆的用户名和密码

    1. 执行安装目录下config.sh ./config.sh 2.选择  2|Extend an existing WebLogic configuration 3. 别的一路跳过,到修改secur ...

  4. [转载]浅谈组策略设置IE受信任站点

    在企业中,通常会有一些业务系统,要求必须加入到客户端IE受信任站点,才能完全正常运行访问,在没有域的情况下,可能要通过管理员手动设置,或者通过其它网络推送方法来设置. 有了域之后,这项工作就可以很好的 ...

  5. 【JVM学习笔记一】JVM内存分布

    Overview 学习JVM首先需要了解一下JVM管理的内存是如何分布的,在看了<深入理解Java虚拟机>和一些博文之后,我准备自己记录一下学习的过程. 下图是JVM中运行时数据区的大致示 ...

  6. 数据库收缩:NOTRUNCATE与TRUNCATEONLY

    在进行数据库收缩时,我们有2个可用选项:NOTRUNCATE,TRUNCATEONLY.这篇文章我们会详细讨论下这2个选项的具体区别. NOTRUNCATE 当你对数据库收缩命令提供NOTRUNCAT ...

  7. SystemTap知识(二)

    Unbuntu安装systemtap: http://www.cnblogs.com/hdflzh/archive/2012/07/25/2608910.html 1 更新源到http://mirro ...

  8. [ASP.NET] 使用 ASP.NET SignalR 添加实时 Web

    ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...

  9. 重构第8天:使用委托代替继承(Replace Inheritance with Delegation)

    理解:根本没有父子关系的类中使用继承是不合理的,可以用委派的方式来代替. 详解:我们经常在错误的场景使用继承.继承应该在仅仅有逻辑关系的环境中使用,而很多情况下却被使用在达到方便为目的的环境中. 看下 ...

  10. JS Date.Format

    // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...