设计模式-16.迭代器模式

185 阅读1分钟

一句话总结

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。例如foreach, for in方法,就是采用的迭代器模式。

Code

static func main() {
    let concreteAggregate = ConcreteAggregate()
    concreteAggregate[0] = "小明"
    concreteAggregate[1] = "小方"

    let concreteIterator = ConcreteIterator(concreteAggregate: concreteAggregate)
    while !concreteIterator.isDone() {
        print(concreteIterator.currentItem())
        concreteIterator.next()
    }
}

protocol Iterator {
    func first() -> Any
    func next() -> Any?
    func isDone() -> Bool
    func currentItem() -> Any
}

protocol Aggregate {
    func createIterator() -> Iterator
}

class ConcreteIterator: Iterator {
    let concreteAggregate: ConcreteAggregate

    var current = 0

    init(concreteAggregate: ConcreteAggregate) {
        self.concreteAggregate = concreteAggregate
    }

    func first() -> Any {
        concreteAggregate[0]
    }

    func next() -> Any? {
        current += 1
        if current < concreteAggregate.count() {
            return concreteAggregate[current]
        }
        return nil
    }


    func isDone() -> Bool {
        current >= concreteAggregate.count()
    }

    func currentItem() -> Any {
        concreteAggregate[current]
    }
}

class ConcreteAggregate: Aggregate {
    var items: [Any] = []

    func createIterator() -> Iterator {
        ConcreteIterator(concreteAggregate: self)
    }

    func count() -> Int {
        items.count
    }

    subscript(index: Int) -> Any {
        get {
            items[index]
        }

        set {
            //此处为伪代码
            items[index] = newValue
        }
    }
}