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

细节


目录
相关文章
|
设计模式 测试技术 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(1)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(1)
310 0
|
设计模式 API iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(2)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(2)
333 0
|
设计模式 API iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
488 0
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
|
设计模式 iOS开发 UED
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(4)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(4)
295 0
|
设计模式 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(5)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(5)
319 0
|
设计模式 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(6)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(6)
319 0
|
设计模式 搜索推荐 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(7)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(7)
565 1
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(7)
|
设计模式 Java
浅析Java设计模式【3.8】——迭代器
Java常用设计模式,迭代器模式
112 0
浅析Java设计模式【3.8】——迭代器
|
设计模式 测试技术 API
淘宝iOS扫一扫架构升级 - 设计模式的应用
本文在“扫一扫功能的不断迭代,基于设计模式的基本原则,逐步采用设计模式思想进行代码和架构优化”的背景下,对设计模式在扫一扫中新的应用进行了总结。
325 0
淘宝iOS扫一扫架构升级 - 设计模式的应用
|
设计模式 算法
设计模式之迭代器
设计模式之迭代器
147 0
设计模式之迭代器

热门文章

最新文章

  • 1
    uniapp云打包ios应用证书的获取方法,生成指南
    27
  • 2
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    117
  • 3
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    20
  • 4
    iOS各个证书生成细节
    36
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    161
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    55
  • 7
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    73
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    54
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    65
  • 10
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    172