iOS设计模式 - 迭代器

原理图

说明

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

源码

https://github.com/YouXianMing/iOS-Design-Patterns

//
// Node.h
// IteratorPattern
//
// Created by YouXianMing on 15/10/26.
// Copyright © 2015年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h> @interface Node : NSObject /**
* 下一个节点
*/
@property (nonatomic, strong) Node *nextNode; /**
* 节点里面的内容
*/
@property (nonatomic, strong) id item; /**
* 初始化节点
*
* @param item 节点携带的内容
*
* @return 节点
*/
- (instancetype)initWithItem:(id)item; @end
//
// Node.m
// IteratorPattern
//
// Created by YouXianMing on 15/10/26.
// Copyright © 2015年 YouXianMing. All rights reserved.
// #import "Node.h" @implementation Node - (instancetype)initWithItem:(id)item { self = [super init]; if (self) { self.item = item;
} return self;
} @end
//
// LinkedList.h
// IteratorPattern
//
// Created by YouXianMing on 15/10/26.
// Copyright © 2015年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Node.h" #import "IteratorProtocol.h"
#import "LinkedListIterator.h" @interface LinkedList : NSObject /**
* 头结点
*/
@property (nonatomic, strong, readonly) Node *headNode; /**
* 节点的数目
*/
@property (nonatomic, assign, readonly) NSInteger numberOfNodes; /**
* 添加数据
*
* @param item 数据
*/
- (void)addItem:(id)item; /**
* 创建迭代器对象
*
* @return 迭代器对象
*/
- (id <IteratorProtocol>)createIterator; @end
//
// LinkedList.m
// IteratorPattern
//
// Created by YouXianMing on 15/10/26.
// Copyright © 2015年 YouXianMing. All rights reserved.
// #import "LinkedList.h" @interface LinkedList () /**
* 头结点
*/
@property (nonatomic, strong, readwrite) Node *headNode; /**
* 节点的数量
*/
@property (nonatomic, assign, readwrite) NSInteger numberOfNodes; @end @implementation LinkedList - (void)addItem:(id)item { if (self.headNode == nil) { self.headNode = [[Node alloc] initWithItem:item]; } else { [self addItem:item node:self.headNode];
} self.numberOfNodes++;
} - (id <IteratorProtocol>)createIterator { return [[LinkedListIterator alloc] initWithLinkedList:self];
} #pragma mark - Private Methods
- (void)addItem:(id)item node:(Node *)node { if (node.nextNode == nil) { node.nextNode = [[Node alloc] initWithItem:item]; } else { [self addItem:item node:node.nextNode];
}
} @end
//
// LinkedListIterator.h
// IteratorPattern
//
// Created by YouXianMing on 15/10/26.
// Copyright © 2015年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h>
#import "IteratorProtocol.h"
@class LinkedList; @interface LinkedListIterator : NSObject <IteratorProtocol> /**
* 由链表进行初始化
*
* @param linkedList 链表对象
*
* @return 迭代器工具
*/
- (id)initWithLinkedList:(LinkedList *)linkedList; @end
//
// LinkedListIterator.m
// IteratorPattern
//
// Created by YouXianMing on 15/10/26.
// Copyright © 2015年 YouXianMing. All rights reserved.
// #import "LinkedListIterator.h"
#import "LinkedList.h" @interface LinkedListIterator () @property (nonatomic, weak) LinkedList *linkedList;
@property (nonatomic, weak) Node *currentNode; @end @implementation LinkedListIterator - (id)initWithLinkedList:(LinkedList *)linkedList { if (self = [super init]) { self.linkedList = linkedList;
self.currentNode = linkedList.headNode;
} return self;
} - (id)next { id item = self.currentNode.item;
self.currentNode = self.currentNode.nextNode; return item;
} - (BOOL)hasNext { if (self.currentNode == nil) { return NO; } else { return YES;
}
} - (id)item { return self.currentNode.item;
} @end
//
// IteratorProtocol.h
// IteratorPattern
//
// Created by YouXianMing on 15/10/26.
// Copyright © 2015年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h> @protocol IteratorProtocol <NSObject> /**
* 下一个对象
*
* @return 对象
*/
- (id)next; /**
* 是否存在下一个对象
*
* @return 对象
*/
- (BOOL)hasNext; /**
* 内容
*
* @return 返回内容
*/
- (id)item; @end
//
// ViewController.m
// IteratorPattern
//
// Created by YouXianMing on 15/10/26.
// Copyright © 2015年 YouXianMing. All rights reserved.
// #import "ViewController.h" #import "LinkedList.h"
#import "LinkedListIterator.h" @interface ViewController () @property (nonatomic, strong) LinkedList *linkedList; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 创建链表结构
self.linkedList = [[LinkedList alloc] init]; // 添加链表元素
[self.linkedList addItem:@""];
[self.linkedList addItem:@""];
[self.linkedList addItem:@""];
[self.linkedList addItem:@""];
[self.linkedList addItem:@""]; // 创建迭代器
id <IteratorProtocol> iterator = [self.linkedList createIterator]; // 进行元素迭代
while ([iterator hasNext]) { NSLog(@"%@", iterator.item);
[iterator next];
}
} @end

细节

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

  1. iOS书摘之Objective-C编程之道 iOS设计模式解析

    来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...

  2. iOS设计模式 - (1)概述

    近期可自由安排的时间比較多, iOS应用方面, 没什么好点子, 就先放下, 不写了.花点时间学学设计模式. 之后将会写一系列博文, 记录设计模式学习过程. 当然, 由于我自己是搞iOS的, 所以之后设 ...

  3. 19. 星际争霸之php设计模式--迭代器模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. IOS设计模式之一(MVC模式,单例模式)

    iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...

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

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

  6. iOS设计模式之生成器

    iOS设计模式之生成器 1.生成器模式的定义 (1): 将一个复杂的对象的构件与它的表示分离,使得相同的构建过程能够创建不同的表示 (2): 生成器模式除了客户之外还包括一个Director(指导者) ...

  7. IOS设计模式之三:MVC模式

    IOS设计模式之三:MVC模式   模型-视图-控制器 这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团 ...

  8. iOS设计模式 - 享元

    iOS设计模式 - 享元 原理图 说明 享元模式使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件.通常物件中的部分 ...

  9. iOS设计模式 - 责任链

    iOS设计模式 - 责任链 原理图 说明 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链 ...

随机推荐

  1. ubuntu16.04安装cuda,无法定位软件包问题

    为了学习深度学习,这几天在安装深度学习框架,cuda安装时却出现无法定位软件包的问题.cuda官网下载时提供了deb和run格式,今天只讲deb格式的安装包安装过程的问题. 按照官方教程,下载好cud ...

  2. T-SQL 片段收藏

    存储过程 CREATE PROCEDURE spInsertOrUpdateProduct --有则更新,否则插入 ) , ) , @StdCost MONEY AS IF EXISTS ( SELE ...

  3. c语言----<项目>_小游戏<2048>

    2048 小游戏 主要是针对逻辑思维的一个训练. 主要学习方面:1.随机数产生的概率.2.行与列在进行移动的时候几种情况.3.MessageBox的使用 #include <iostream&g ...

  4. Android应用博客目录

    应用有很多,开个博客都放进来方便查找,也方便修改 1 语言类: 1.1 JAVA 基础语言知识JAVA Collection与Collections,Array与Arrays的区别 JAVA练手--S ...

  5. Linux下常用的3种软件安装方式

    一:Linux源码安装    1.解压源码包文件    源码包通常会使用tar工具归档然后使用gunzip或bzip2进行压缩,后缀格式会分别为.tar.gz与.tar.bz2,分别的解压方式:   ...

  6. WCF webHttpBinding协议上传接收文件

    一般情况下wcf用webHttpBinding协议最多的场景就是前后端Json交互,会比较轻量级. 接收上传的文件也可以,不过要自己解析处理. 前端HTML很简单: <input type=&q ...

  7. java SE 入门之输入输出(第四篇)

    在第一篇,八大基本类型的时候,我就介绍了输出,当然,这些输出都是简单的,后续写到流的时候,在细化输入输出. 现在只要求看懂输入输出.输入其实就是接受键盘的输入. public class Hello ...

  8. insert into 语句的三种写法

    insert into 语句的三种写法 方式1. INSERT INTO t1(field1,field2) VALUES (v001,v002);            // 明确只插入一条Valu ...

  9. jQuery如何根据元素值删除数组元素

    用到的方法$.inArry(); $.inArray( value, array [, fromIndex ] ) value 任意类型 用于查找的值. array Array类型 指定被查找的数组. ...

  10. Java反射拾遗

    定义:Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息.反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set ...