iOS设计模式之迭代器模式
迭代器模式
基本理解
- 迭代器模式(Iterrator):提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该元素的内部表示。
- 当你访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。
- 你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。
- 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
- 迭代器定义了一个用于访问集合元素并记录当前元素的接口。
- 不同的迭代器可以执行不同的迭代策略。
- 外部迭代器和内部迭代器
- 外部迭代器
- 外部迭代器让客户端直接操作迭代过程,所以客户端需要知道外部迭代器才能使用。但是它为客户端提供了更多的控制
- 客户端创建并维护外部迭代器
- 客户端可以使用不同外部迭代器实现多种类型的遍历
- 内部迭代器
- 客户端不需要知道任何外部迭代器,而是可以通过集合对象的特殊接口,或者一次访问一个元素,或者向集合中的每个元素发送消息。
- 集合对象本身创建并维护它的外部迭代器
- 集合对象可以在不修改客户端代码的情况下,选择不同的外部迭代器
何时使用迭代器
- 需要访问组合对象的内容,而又不是暴露其内部标示
- 需要通过多种方式遍历组合对象
- 需要提供一个统一的接口,用来遍历各种类型的组合对象
在Cocoa Touch框架中使用迭代器模式
苹果公司用自己命名规则“枚举器/枚举”改写了迭代器模式,用于相关基础类的各种方法。也就是说枚举就是苹果版本的迭代。
基础框架中的NSEnumerator类实现了迭代器模式。抽象NSEnumerator类的私有具体子类返回枚举器对象,能够顺序遍历各种几何--数组、集(set)、字典(值与键),把集合的对象返回给客户端。
NSEnumerator可以枚举NSArray/NSDictionary和NSSet对象中的元素。它本身是个抽象类。它依靠几个工厂方法,如objectEnumerator或keyEnumerator,来创建并返回相应的具体枚举器对象。
从iOS4开始,有了另一种枚举Cocoa Touch框架中集合对象的方法,叫做基于块的枚举。
快速枚举,这个是苹果推荐的枚举方法。它允许把集合对象的枚举直接用作for循环的一部分,无需使用其他枚举器对象,而且比传统的基于索引的for循环效率更高,形如:
NSArray *arr = @[@"zhangsan",@"lisi",@"wangwu"]; for(NSString *item in arr)
{
NSLog(@"%@",item);
}
例子
该例子定义了一个集合Set和一个迭代器ConcreteIterator。然后通过迭代器来输出集合Set对象的元素。
ConcreteSet.h
//
// ConcreteSet.h
// IterationDemo
//
// Created by zhanggui on 15/8/8.
// Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface ConcreteSet : NSObject
{
NSMutableArray *items;
}
-(NSInteger)getCount;
-(id)getItemFromIndex:(NSInteger)index;
-(void)insertItem:(id)item;
@end
ConcreteSet.m
//
// ConcreteSet.m
// IterationDemo
//
// Created by zhanggui on 15/8/8.
// Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import "ConcreteSet.h"
#import "ConcreteIterator.h"
@implementation ConcreteSet
-(id)init
{
self = [super init];
if (self) {
items = [NSMutableArray new];
}
return self;
}
-(NSInteger)getCount
{
return [items count];
}
-(id)getItemFromIndex:(NSInteger)index
{
return [items objectAtIndex:index];
}
-(ConcreteIterator *)createiterator
{
return [ConcreteIterator new];
}
-(void)insertItem:(id)item
{
[items addObject:item];
}
@end
Concreteiterator.h
//
// ConcreteIterator.h
// IterationDemo
//
// Created by zhanggui on 15/8/8.
// Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import <Foundation/Foundation.h>
@class ConcreteSet;
@interface ConcreteIterator : NSObject
{
ConcreteSet *mySet;
int current;
}
-(id)FirstItem;
-(id)nextItem;
-(BOOL)isFinish;
-(id)currentItem;
-(id)initWithConcreteSet:(ConcreteSet *)concrete;
@end
Concreteiterator.m
//
// ConcreteIterator.m
// IterationDemo
//
// Created by zhanggui on 15/8/8.
// Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import "ConcreteIterator.h"
#import "ConcreteSet.h"
@implementation ConcreteIterator
-(id)initWithConcreteSet:(ConcreteSet *)concrete
{
self = [super init];
if (self) {
mySet = concrete;
}
return self;
}
-(id)FirstItem
{
return [mySet getItemFromIndex:0];
}
-(id)nextItem
{
current ++;
if (current<[mySet getCount]) {
return [mySet getItemFromIndex:current];
}else
{
return nil;
}
}
-(BOOL)isFinish
{
return current>=[mySet getCount] ? YES : NO;
}
-(id)currentItem
{
return [mySet getItemFromIndex:current];
}
@end
然后在ViewController中测试
//
// ViewController.m
// IterationDemo
//
// Created by zhanggui on 15/8/8.
// Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import "ViewController.h"
#import "ConcreteIterator.h"
#import "ConcreteSet.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// NSArray *arr = @[@"apple",@"banana",@"orange"];
//
// for(NSString *item in arr)
// {
// NSLog(@"%@",item);
// }
ConcreteSet *set = [[ConcreteSet alloc] init];
[set insertItem:@"apple"];
[set insertItem:@"banana"];
[set insertItem:@"orange"];
NSLog(@"Count is :%ld",(long)[set getCount]);
ConcreteIterator *iterator = [[ConcreteIterator alloc] initWithConcreteSet:set];
while (![iterator isFinish]) {
NSLog(@"%@",[iterator currentItem]);
[iterator nextItem];
}
}
@end
用自己定义的迭代器去输出元素和用苹果枚举效果类似。苹果推荐使用类似与viewDidLoad方法中的for循环来输出集合元素。
附:
iOS设计模式之迭代器模式的更多相关文章
- iOS 设计模式之工厂模式
iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...
- Python进阶:设计模式之迭代器模式
在软件开发领域中,人们经常会用到这一个概念——“设计模式”(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础 ...
- 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
- js设计模式——4.迭代器模式
js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...
- 实践GoF的设计模式:迭代器模式
摘要:迭代器模式主要用在访问对象集合的场景,能够向客户端隐藏集合的实现细节. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:迭代器模式>,作者:元闰子. 简介 有时会遇到这 ...
- 【GOF23设计模式】迭代器模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 package com.test.iterator; /** * 自定义的迭代 ...
- [设计模式] 16 迭代器模式 Iterator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...
- php设计模式之迭代器模式
今天的PHP设计模式系列的主角是迭代器(Iterator)模式,迭代器模式提供了抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代. 迭代器(Iterator)模式,它在一个很常见的过程上提供了 ...
随机推荐
- 论文第4章:iOS绘图平台的实现
面向移动设备的矢量绘图平台设计与实现 Design and Implementation of Mobile Device-oriented Vector Drawing Platform 引用本论文 ...
- 个人对joomla3.2x和joomla2.5X浅薄看法
很久没有写joomla文章了,发现想写的东西还是挺多的,后面抽时间补回来,其实更多还是php的一些东西.joomla3.0以后系统改变挺大,后台都是用bootstrap作为主题,个人对这个无爱,因为他 ...
- C#生成不重复的随机数(转)
我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复随机数的题目,在.net Framework中提供了一个专门用来产生随机数的类System.Random. 对于随机数,大家都知道,计算机 ...
- No Dialect mapping for JDBC type: -9
由于项目中使用的是hibernate 4.35版本和sqlserver 2008数据库.所以,自定义方言时,需要和老版本做区别: public class MySQLServerDialect ext ...
- 网络通信分享(一):数字签名,数字证书,https通信,数据加密
加密算法: 一:对称加密算法 在对称加密算法中,加密使用的密钥和解密使用的密钥是相同的.也就是说,加密和解密都是使用的同一个密钥.因此对称加密算法要保证安全性的话,密钥要做好保密,只能让使用的人知道, ...
- Sphinx全文索引 第一节
1 使用场景:用来解决站内搜索的一些应用场景. 网站中的搜索(站内搜索) 系统后台中的搜索 第一种方式:PHP——>MySQL 第二种方式:MySQL<——>Sphinx:PHP—— ...
- Android学习笔记之DocumentBuilder的使用....
PS:当你的才华还撑不起你的野心时,那你需要静下心来学习..... 学习内容: 1.从服务器上获取XML文档... 2.解析XML文档中的内容... XML文件想必大家都非常的熟悉,可扩展的标记语 ...
- sublime 插件zen coding
sublime的插件Zen Coding是一个编写html的神器,现在已经更名为Emmet了. 在sublime中的package需要搜索的是Emmet 相关网站: 官网 Zen Coding: 一种 ...
- Python入门笔记(12):表达式和语句
一.Python语句 if语句.else语句.elif语句.条件表达式.while语句.for语句.break语句.continue语句.pass语句.Iterators(迭代器).列表解析 二.常用 ...
- Dynamics AX 中重点数据源方法
数据源方法 描述 Active 当用户刚选中一行数据时执行该方法.若选中的是主表的数据,也用该方法来触发加载从表符合条件的数据.主要覆盖该方法来根据条件设置记录及其字段是否可见或是否可被编辑. ...