迭代器模式
定义
提供一种方法顺序访问一个聚合对象中各个元素 , 而又不需暴露该对象的内部表示。
动机
不同的对象有不同的遍历方式,即使可以 预见到所需的那些遍历操作,你可能也不希望列表的接口中充斥着各种不同遍历的操作。 有时还可能需要在同一个表列上同时进行多个遍历。
适用性
- 访问一个聚合对象的内容而无需暴露它的内部表示。
- 支持对聚合对象的多种遍历。
- 为遍历不同的聚合结构提供一个统一的接口 (即, 支持多态迭代)。
实现
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class BreakfastMenu(object):
def __init__(self):
self.items = []
def add_item(self, name, price):
self.items.append((name, price))
def __iter__(self):
""" return a Iterable object """
return iter(self.items)
class LaunchMenu(object):
def __init__(self):
self.items = set()
def add_item(self, name, price):
self.items.add((name, price))
def __iter__(self):
""" return a Iterable object """
return iter(self.items)
class DinnerMenu(object):
def __init__(self):
self.items = {}
def add_item(self, name, price):
self.items[name] = price
def __iter__(self):
""" return a Iterable object """
return iter(((name, price) for name, price in self.items.items()))
if __name__ == '__main__':
breakfast_menu = BreakfastMenu()
breakfast_menu.add_item('milk', 5)
breakfast_menu.add_item('bread', 6)
breakfast_menu.add_item('coffee', 7)
breakfast_menu.add_item('donuts', 3)
print('\nBreakfastMenu:')
for item in breakfast_menu:
print(item)
launch_menu = LaunchMenu()
launch_menu.add_item('milk', 5)
launch_menu.add_item('bread', 6)
launch_menu.add_item('coffee', 7)
launch_menu.add_item('donuts', 3)
print('\nLaunchMenu:')
for item in launch_menu:
print(item)
dinner_menu = DinnerMenu()
dinner_menu.add_item('milk', 5)
dinner_menu.add_item('bread', 6)
dinner_menu.add_item('coffee', 7)
dinner_menu.add_item('donuts', 3)
print('\nDinnerMenu:')
for item in dinner_menu:
print(item)