分享

设计模式之迭代器模式

 太极混元天尊 2018-05-23


迭代器模式,英文为Iterator模式,是我们经常常用但是又最容易忽略的模式,例如,Python中我们访问列表中的数据,通常是按照如下方式访问的:

L = [1 , 2, 3, 4, 5]
for number in L:
   print number

这便是迭代器模式,它提供了一种方法能够顺序访问集合(这里表示示例L)中的所有元素,而又不暴露集合内部的实现方式。


其实迭代器的本质是实现了一种方式,能够判断集合中是否还有未被访问的元素,以及提供访问这个元素的方式。通常迭代器是定义如下:

from abc import abstractmethod

class Iterator(object):

   def __init__(self):
       pass

   @abstractmethod
   def hasNext(self):
       pass

   @abstractmethod
   def next(self):
       pass

即实现了两个方法,是否还有未被访问的元素和下一个未被访问的元素。


举个通俗的例子,一个书架上摆满了书,我们需要查找某本书时,就用到了迭代器模式。我们需要能够查找所有的书,在不知道书架如何摆放书的情况下。这里,我们将书定义为如下:

class Book:

   def __init__(self, name, number):
       self.name = name
       self.number = number

包含两个属性,名称和编号。


同时,我们将书架定义如下:

class BookShelf:

   def __init__(self):
       self.books = []

   def appendBook(self, book):
       self.books.append(book)

   def getBookAt(self, index):
       return self.books[index]

   def getLength(self):
       return self.books.__len__()

书嫁实现了增加书目,查找index位置的数目以及总共的图书数目这几个方法。


接下来就是最重要的,也就是Iterator的具体实现:

class BookShelfIterator(Iterator):

   def __init__(self, bookShelf):
       self.bookShelf = bookShelf
       self.index = 0

   def hasNext(self):
       if self.index <>
           return True
       else:
           return False

   def next(self):
       book = self.bookShelf.getBookAt(self.index)
       self.index = self.index + 1
       return book

这里,通过bookShelf的相关方法,来实现了Iterator中的hasNext和next方法。因此,main函数在调用的时候,只需要调用这两个方法,便可以访问书架中的所有的数目,从而屏蔽了书架中展示数目的方式。


main函数的实现如下:

if __name__ == '__main__':
   bookShelf = BookShelf()
   bookShelf.appendBook(Book('穷查理宝典',1))
   bookShelf.appendBook(Book('证券分析', 2))
   bookShelf.appendBook(Book('经济学原理', 3))

   bookShelfIterator = BookShelfIterator(bookShelf)

   while(bookShelfIterator.hasNext()):
       book = bookShelfIterator.next()
       print book.name, book.number

这里假设有三本书。这样,通过hasNext方法和next方法便可以访问数目的具体信息。


最后,总结一下迭代器模式:


  • 提供了一种方法能够顺序访问集合中的所有元素

  • 这种方法不暴露集合内部的实现方式


参考:

  • 结城浩 《图解设计模式》


(完)


看完本文有收获?请转发分享给更多人

关注「Python那些事」,做全栈开发工程师

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多