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

细节


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