• 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

    细节

  • 相关阅读:
    sql server与c#中数据类型的对应关系
    XML操作类
    手機錄音amr格式轉換工具
    ajax get,post提交數據
    javascript對文本encode編碼
    桌面图标透明设置→详解
    货币大写转换类
    利用DataAdapter於數擾庫同步
    JavaScript的RegExp对象
    添加計劃任務,自動備份腳本
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4911148.html
Copyright © 2020-2023  润新知