设计模式之 Iterator 迭代器:Swift 实现

Iterator Mode 迭代器模式

The idea of the iterator is to extract the traversal behavior into an independent iterator object. The collection has some elements, and we use the iterator to get each element step by step.

迭代器的主要思想是将遍历行为抽取为单独的迭代器对象。

集合里有一些元素,使用关于集合的迭代器一步接一步地访问每个元素。

在这里插入图片描述
如下代码,集合使用数组实现,有正向和反向两种迭代器可以使用。迭代器的调用是统一的格式,判断有没有下一个,若有则访问,若无则结束;选择了不同的迭代器,则迭代效果不同

// Element in the collection
class Node {
    var info: String = ""
    init(_ s: String) {
        self.info = s
    }
}

// Iterator
protocol Iterator {
    func hasNext() -> Bool
    func getNext() -> Node
}

// Concrete iterator
class PositiveIterator: Iterator {
    
    var collection: Collection
    var curIndex = 0

    init(_ c: Collection) {
        self.collection = c
    }
    
    func hasNext() -> Bool {
        if curIndex < collection.nodes.count {
            return  true
        } else {
            return false
        }
    }
    
    func getNext() -> Node {
        var node = collection.nodes[curIndex]
        curIndex += 1
        return node
    }
    
}

// Concrete iterator
class RevertIerator: Iterator {
    var collection: Collection
    var curIndex = 0
    
    init(_ c: Collection) {
        self.collection = c
        self.curIndex = collection.nodes.count - 1
    }
    
    func hasNext() -> Bool {
        if curIndex >= 0{
            return  true
        } else {
            return false
        }
    }
    
    func getNext() -> Node {
        var node = collection.nodes[curIndex]
        curIndex -= 1
        return node
    }
}

// Collection
protocol Collection {
    var nodes: [Node] { get set }
    func getIterator() -> Iterator
    func getRevertIterator() -> Iterator
}

// Concrete collecton
class NodesCollection: Collection {
    var nodes: [Node]
    init() {
        self.nodes = []
    }
    
    func append(_ n: Node) {
        nodes.append(n)
    }
    
    func getIterator() -> Iterator {
        return PositiveIterator(self)
    }
    
    func getRevertIterator() -> Iterator {
        return RevertIerator(self)
    }
}

let str = "hello world"
let collection = NodesCollection()
for s in str {
    collection.append(Node(String(s)))
}

var it = collection.getIterator()

while (it.hasNext()) {
    var n = it.getNext()
    print(n.info, terminator: " ")
}

print()

it = collection.getRevertIterator()

while (it.hasNext()) {
    var n = it.getNext()
    print(n.info, terminator: "_")
}

collection 依赖于 iterator,在有需要的时候通过集合得到能遍历集合的迭代器入口,一个迭代器使用一次,然后访问下一个,如此重复操作,直到迭代器为空。所以是使用迭代器对集合进行遍历,每次访问到的是 node ,是具体的数据元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值