您的位置:首页 > 其它

23设计模式之迭代器模式(Iterator)

2015-09-19 22:57 225 查看

返回首页

一、概述

Iterator属于行为型模式中的一种,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

二、适用性

1. 访问一个聚合对象的内容而无需暴露它的内部表示。
2. 支持对聚合对象的多种遍历。
3. 为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。

三、参与者

1. Iterator:迭代器定义访问和遍历元素的接口。
2. ConcreteIterator:具体迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。
3. Aggregate:聚合定义创建相应迭代器对象的接口。
4. ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。

四、类图



五、代码实现

1. Iterator:迭代器定义访问和遍历元素的接口。

Iterator.swift

import Foundation

/// 迭代器定义访问和遍历元素的接口
protocol Iterator {
    
    /** 下一个*/
    func next() ->AnyObject
    /** 第一个*/
    func first()
    /** 最后一个*/
    func last()
    /** 是否有下一个*/
    func hasNext() ->Bool
    
}




2. ConcreteIterator:具体迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。

IteratorImpl.swift

import Foundation

/// 具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置
class IteratorImpl: Iterator {
    
    /// 数组
    private var list:List
    /// 位置
    private var index:Int
    
    init(list:List) {
        self.index = 0
        self.list = list
    }
    
    func first() {
        self.index = 0
    }
    
    func last() {
        self.index = self.list.getSize()
    }
    
    func next() -> AnyObject {
        let obj:AnyObject = self.list.get(index)
        self.index += 1
        return obj
    }
    
    func hasNext() -> Bool {
        return self.index < self.list.getSize()
    }
    
}


3. Aggregate:聚合定义创建相应迭代器对象的接口。

List.swift

import Foundation

/// 聚合定义创建相应迭代器对象的接口
protocol List {
    
    func iterator() ->Iterator
    
    func get(index:Int) ->AnyObject
    
    func getSize() ->Int
    
    func add(obj:AnyObject)

}


4. ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。

ListImpl.swift

import Foundation

/// 具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例.
class ListImpl: List {

    /// 数组
    private var list:[AnyObject] = []
    /// 位置
    private var index:Int = 0
    /// 长度
    private var size:Int = 0
    
    func iterator() ->Iterator {
        return IteratorImpl(list: self)
    }
    
    func get(index:Int) ->AnyObject {
        return list[index]
    }
    
    func getSize() ->Int {
        return size
    }
    
    func add(obj:AnyObject) {
        list.append(obj)
        index += 1
        size += 1
    }

}


六、测试

1. 代码

// 迭代器模式
let list:List = ListImpl()
list.add("a")
list.add("b")
list.add("c")
//第一种迭代方式
let it = list.iterator();
while (it.hasNext()) {
    println(it.next())
}
println("===========")
//第二种迭代方式
for (var i = 0; i < list.getSize(); i++) {
    println(list.get(i));
}<span style="font-size:14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>


2. 运行结果

a
b
c
===========
a
b
c
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: