iOS设计模式 - 迭代器

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:@"1"];[self.linkedList addItem:@"2"];[self.linkedList addItem:@"3"];[self.linkedList addItem:@"4"];[self.linkedList addItem:@"5"];// 创建迭代器id <IteratorProtocol> iterator = [self.linkedList createIterator];// 进行元素迭代while ([iterator hasNext]) {NSLog(@"%@", iterator.item);[iterator next];}
}@end

 

细节

转载于:https://www.cnblogs.com/YouXianMing/p/4911148.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android M 新的运行时权限开发者需要知道的一切

android M 的名字官方刚发布不久&#xff0c;最终正式版即将来临&#xff01; android在不断发展&#xff0c;最近的更新 M 非常不同&#xff0c;一些主要的变化例如运行时权限将有颠覆性影响。惊讶的是android社区鲜有谈论这事儿&#xff0c;尽管这事很重要或许在不远的将来会…

SpringMVC关于json、xml自动转换的原理研究[附带源码分析]

目录 前言现象源码分析实例讲解关于配置总结参考资料 前言 SpringMVC是目前主流的Web MVC框架之一。 如果有同学对它不熟悉&#xff0c;那么请参考它的入门blog&#xff1a;http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 现象 本文使用的demo基于maven…

Android为网络请求自定义加载动画

android自带的加载动画都不怎么好看&#xff0c;在这里介绍一种自定义加载动画的方法 原始图片&#xff1a; 编写动画progressbar.xml, <?xml version"1.0" encoding"utf-8"?> <animated-rotate android:drawable"drawable/publicloading&…

Chapter 5 Exercises Problems

转载于:https://www.cnblogs.com/momoko/p/4931714.html

React-Native 填坑之ListView(item更新)

一 背景 效果图如下&#xff1a;二 解决办法 我的目的是实现单选item&#xff0c;正常情况设置一个state变量来保存选中的Index,在每次点击item的时候改变index就OK&#xff01;但是&#xff0c;我想的太天真了。this.setState()只能渲染外部组件&#xff0c;而ListView子组件…

锋利的jQuery--编写jQuery插件(读书笔记五)[完结篇]

1.表单验证插件Validation2.表单插件Form3.动态事件绑定插件livequery可以为后来的元素绑定事件类似于jQuery中的live()方法4.jQuery UI5.jQuery Cookie6.遮罩层插件:thickbox7.编写jQuery插件<1>编写插件的目的&#xff1a;给已经有的一些列方法或函数做一个封装&#x…

React Native 实现物流进度信息

1.实现效果 2.直接上代码 use strict; import React, {Component} from react; import {View, StyleSheet, Text, Dimensions} from react-native export default class Button extends Component {render() {let invoice [{id: 111, content: 已签收,签收人&#xff1a;门…

String中intern的方法

intern public String intern() 返回字符串对象的规范化表示形式。 一个初始时为空的字符串池&#xff0c;它由类 String 私有地维护。 当调用 intern 方法时&#xff0c;如果池已经包含一个等于此 String 对象的字符串&#xff08;该对象由 equals(Object) 方法确定&#xff0…

Vue创建递归树组件(点击可展开关闭)

本篇文章借鉴于此处&#xff0c;如果只需显示树形组件&#xff0c;可以直接访问该博主文章。我这里对他的组件做了扩展&#xff0c;增加了点击展开和关闭操作&#xff0c;话不多说上代码。 1.数据结构 const data {label: 根目录,children: [{label: 目录A,children: [// 叶…