设计模式十六迭代器模式:边学边做个生成电子书的工具(python+dart)

122 阅读1分钟

意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。

主要解决:不同的方式来遍历整个整合对象。

何时使用:遍历一个聚合对象。

如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。

image.png

python 实现

class BaseIterator:

    def __init__(self,data):
        self.__data = data
    def to_begin(self):
        self.__cur_idx = -1

    def to_end(self):
        self.__cur_idx = len(self.__data)

    def next(self):
        if(self.__cur_idx <len(self.__data) -1):
            self.__cur_idx +=1
            return True
        else:
            return False

    def privious(self):
        if self.__cur_idx >0:
            self.__cur_idx-=1
            return True
        else:
            return False

    def current(self):
        return self.__data[self.__cur_idx] if self.__cur_idx<len(self.__data) and self.__cur_idx >=0 else None




if __name__ == '__main__':
    iterator  =  BaseIterator(range(0,20))
    iterator .to_begin()
    while(iterator.next()):
        customer = iterator.current()
        print(customer,end="\t")
    print()



    iterator.to_end()
    while(iterator.privious()):
        customer = iterator.current()
        print(customer,end="\t")

python 本身实现

from collections import Iterable, Iterator





"""

要使自定义的类具有Iterable属性,需要实现__iter__方法。

要使自定义的类具有Iterator属性,需要实现__iter__和__next__方法

"""





class NumberSequence:

    """ 生成一个间隔为step的数字系列 """



    def __init__(self, init, step, max=100):

        self.__data = init

        self.__step = step

        self.__max = max



    def __iter__(self):

        return self



    def __next__(self):

        if self.__data < self.__max:

            tmp = self.__data

            self.__data += self.__step

            return tmp

        else:

            raise StopIteration





if __name__ == '__main__':

    num_seq = NumberSequence(0, 5, 20)

    print(isinstance(num_seq, Iterable))

    print(isinstance(num_seq, Iterator))

    for n in num_seq:

        print(n, end="\t")

dart 实现

abstract class Iterator {
  bool hasNext();
  Object? next();
}

abstract class Container {
  Iterator getIterator();
}

class NameRespository implements Container {
  List<String> names = ["reboert", "john", "julic", "lora"];

  @override
  Iterator getIterator() {
    return NameIterator(names);
  }
}

class NameIterator implements Iterator {
  List<String> _names;
  int _index = 0;

  NameIterator(this._names);

  @override
  bool hasNext() {
    if (_index < _names.length) {
      return true;
    }
    return false;
  }

  @override
  Object? next() {
    if (this.hasNext()) {
      return _names[_index++];
    }
    return null;
  }
}

void main(List<String> args) {
  NameRespository nameRepository = NameRespository();
  for (Iterator iter = nameRepository.getIterator(); iter.hasNext();) {
    Object? name = iter.next();
    print("name = $name ");
  }
}